OpenCVにおける等高線比較(CからC ++への変換)

私はまだC ++の新機能ですが、今ではこの部分からいくつかの部分を変換する必要があります。 C ++でしか利用できないので、私のプログラムで BackgroundSubtractorMOG2 を適用したいからです。基本的に、このプログラムは、背景差分に基づいてビデオカメラから輪郭を検出しますを選択し、利用可能な最大の等高線を選択します。

私は特にこの部分に問題があります(古いプログラム):

double largestArea = 0;                    //Const. for the largest area
CvSeq* largest_contour = NULL;             //Contour for the largest area
while (current_contour != NULL){           //If the current contour available
    double area = fabs(cvContourArea(current_contour,CV_WHOLE_SEQ, false));   //Get the current contour's area as "area"    
    if(area > largestArea){            //If "area" is larger than the previous largest area
        largestArea = area;
        largest_contour = current_contour; 
    }
    current_contour = current_contour->h_next;  //Search for the next contour
}

この部分では、プログラムが current_contour として利用可能な各輪郭をスキャンし、その領域を見つけてそれを以前の最大輪郭と比較します。私の質問は、 current_contour の取得方法、その領域、C ++で次の輪郭にジャンプする方法です。また、 contours.size )?スキャンした輪郭の数または輪郭の総面積ですか?

これは私がこれまで行ってきたことです:

for(;;)
{
    cap >> frame;//get a new frame from camera
    if( frame.empty() )
            break;
    image=frame.clone();
    mog(frame,foreground,-1);

    threshold(foreground,foreground,lowerC,upperC,THRESH_BINARY);
    medianBlur(foreground,foreground,9);
    erode(foreground,foreground,Mat());
    dilate(foreground,foreground,Mat());

    findContours(foreground,contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);  

    if(contours.empty())
        continue;

//Starting this part
    double largest_area = 0;
    for(int i= 0; i < contours.size(); i++){
        double area = contourArea(contours);
        if(area >= largest_area){
            largest_area = area;
            largest_contours = contours;
        }
    }
//Until this part

    drawContours(image,largest_contours,-1,Scalar(0,0,255),2);

    imshow( "Capture",image );
    imshow("Contours",foreground);

    if(waitKey(30) >= 0) break;

}

前もって感謝します。

PS:古いプログラムにはいくつかのバグがありますが、アルゴリズムは正常に動作します。更新されたプログラムが必要な場合は私には無料です。現在OpenCV 2.4.3 + VS C ++ 2010 Expを使用しています。

編集:

私を助けようとしている皆さん、ありがとうございますが、私はすでにこちらからの回答を得ていますをご覧ください。それでも、 C のOpenCVは C ++ のOpenCVとまったく同じではありません。

0
nl ru de
問題をどのように解決したのかを記述し、それを投稿して答えとして受け入れることができます。私たちがそれを知っているその方法。それが解決され、b。どのように解決しましたか?
追加された 著者 IBG,

1 答え

これはコードの一部で、イメージ上のすべての等高線を見つけて、その周囲と面積を計算します:

IplImage* bin = cvCreateImage( cvGetSize(_image), IPL_DEPTH_8U, 1);
cvConvertImage(_image, bin, CV_BGR2GRAY);
cvCanny(bin, bin, 50, 200);
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* contours=0;

//Number of all contours on image @[email protected]
int contoursCont = cvFindContours( bin, storage,&contours,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));
assert(contours!=0);

// iterate through all contours --> current = current->h_next
 for( CvSeq* current = contours; current != NULL; current = current->h_next )
 {
     //calculate perimeter and area of each contour
     double area = fabs(cvContourArea(current));
     double perim = cvContourPerimeter(current);
     cvDrawContours(_image, current, cvScalar(0, 0, 255), cvScalar(0, 255, 0), -1, 1, 8);
     //the rest code 
  }

OpenCVのドキュメントから:

関数cvFindContoursは、2値画像から輪郭線を取り出し、取り出された輪郭線の数を返す。ポインタCvSeq * contours = 0は関数によって満たされます。最初の最も外側の輪郭へのポインタを含みます。輪郭が検出されない場合はNULLです(画像が完全に黒い場合)。他の輪郭は、h_nextおよびv_nextリンクを使用してfirst_contourから到達することができます。

0
追加された
ありがとうございますが、OpenCVコードは C 言語です。さらに、私はすでに C の領域を比較するプログラムを作っています(Click a a href = "http://stackoverflow.com/questions/12971093/better-アルゴリズム - for-edge-filter- video-programming "> here を参照してください)。今私はそれをC ++に変換する必要があり、それが私の主な質問です。
追加された 著者 Samir Izmier Chong,