2011-12-02 16 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辺を持つ輪郭を返しています。これは見つかった最大の輪郭になり、コード内のロジックが無効になります。これを修正するにはどうしますか?画面が空白のときにnullベクトルを返すようにします。

http://imgur.com/a/hJCQl

http://imgur.com/a/hJCQl

また、このコードは、効率を改善するために、とにかくに向上させることができますか?

+1

Yikes!愚かなエラー..私はそれを正しいとマークすることができるように別のコメントとしてあなたの答えをしてください – Madman

答えて

5

あなたの背景は黒く(0)、輪郭を描くオブジェクトは白く(または> = 1)にする必要があります。あなたはそれを逆にしているので、FindContoursが背景ではなく輪郭として背景を検出します。

関連する問題