私はまだ C++ に慣れていませんが、この古いプログラムBackgroundSubtractorMOG2
の一部を C から C++ に変換する必要があります。これは、C++ でしか利用できないため、自分のプログラムに適用したいからです。基本的に、このプログラムは、背景の減算に基づいてビデオ カメラから輪郭を検出し、利用可能な最大の輪郭を選択します。
特にこの部分に問題があります(古いプログラムから取得):
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++ で次の輪郭にジャンプする方法です。また、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 を使用しています。
編集:
私を助けようとしているすべての人に感謝しますが、私はすでにここからの答えを得ています。それでも、まだわからない人のために:の OpenCV は の OpenCV とまったく同じではありC
ませんC++
。