2011-12-02 14 views
9

मेरे पास निम्न कोड है जो पृष्ठभूमि घटाव करता है और फिर अग्रभूमि ऑब्जेक्ट के चारों ओर एक सीमा खींचने के लिए FindContours का उपयोग करता है।OpenCV findContours समस्या

// frame - Input frame from a camera. 
// output - Output frame to be displayed. 
    void process(cv:: Mat &frame, cv:: Mat &output) { 

    cv::cvtColor(frame, gray, CV_BGR2GRAY); 

    // initialize background to 1st frame 
    if (background.empty()) 
     gray.convertTo(background, CV_32F); 

    // convert background to 8U 
    background.convertTo(backImage,CV_8U); 

    // compute difference between current image and background 
    cv::absdiff(backImage,gray,foreground); 

    // apply threshold to foreground image 
    cv::threshold(foreground,output,threshold,255,cv::THRESH_BINARY_INV); 

    // accumulate background 
    cv::accumulateWeighted(gray, background, learningRate, output); 

    // Find regions of interest 
    std::vector<std::vector<cv::Point> > v; // Detected foreground points 

    cv::findContours(output,v,CV_RETR_LIST,CV_CHAIN_APPROX_NONE); 

    // Sort to find the entry with the most points at the beginning. 
      // This is done to overcome noisy input. 
    std::sort(v.begin(), v.end(), DescendingCompare); 

    cv::Mat drawing = frame; 

    std::vector<std::vector<cv::Point>> contours_poly(1); 

    // Determine an approximate polygon for v[0] which is the largest contour 
    cv::approxPolyDP(cv::Mat(v[0]), contours_poly[0], 3, false); 

    // Draw polygonal contour 
    cv::Scalar color = cv::Scalar(0,0,255); 
    cv::drawContours(drawing, contours_poly, 0, color, 2, 8, std::vector<cv::Vec4i>(), 0, cv::Point()); 

    // Show in a window 
    output = drawing; 
    v.clear(); 

} 

छवि सिर्फ एक खाली सफेद पृष्ठभूमि लेकिन findContours() छवि के 4 किनारों के साथ एक समोच्च लौट रहा है। यह कोड में मेरे तर्क को नकारते हुए सबसे बड़ा समोच्च पाया जाता है। क्या इसे ठीक करने के लिए वैसे भी है? मैं स्क्रीन खाली होने पर इसे एक नल वेक्टर वापस करना चाहता हूं।

http://imgur.com/a/hJCQl

http://imgur.com/a/hJCQl

इसके अलावा, इस कोड भी तरह सुधार किया जा सकता दक्षता में सुधार के लिए?

+1

यिक्स! मूर्खतापूर्ण त्रुटि .. कृपया अपना उत्तर एक अलग टिप्पणी के रूप में बनाएं ताकि मैं इसे सही के रूप में चिह्नित कर सकूं – Madman

उत्तर

5

आपकी पृष्ठभूमि काला (0) होनी चाहिए और कोई भी वस्तु जिसे आप समोच्च करना चाहते हैं वह सफेद होना चाहिए (या> = 1)। आपने इसे उलट दिया है और यही कारण है कि FindContours पृष्ठभूमि को एक समोच्च के रूप में पहचानता है, न कि ऑब्जेक्ट।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^