我仍然是C ++的新手,现在我需要将我的old program中的一些部分从C转换为C ++,因为我想在我的程序中应用BackgroundSubtractorMOG2
,因为它只能在C ++中使用。基本上,该程序将根据background subtraction检测来自摄像机的轮廓,并选择可用的最大轮廓。
我有一个问题,尤其是这部分(取自old program):
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。修改
感谢所有想帮助我的人,但我已经得到了来自here的答案。不过,对于那些仍然不知道的人: C
中的OpenCV与C++
中的OpenCV不完全相同。
答案 0 :(得分:0)
这是代码的一部分,我在其中找到图像上的所有轮廓并对其周边和区域进行煅烧:
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 @contoursCont@
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从二进制图像中检索轮廓并返回检索到的轮廓数。指针CvSeq * contours = 0由函数填充。如果没有检测到轮廓(如果图像是完全黑色的话),它将包含指向第一个最外侧轮廓的指针或NULL。可以使用h_next和v_next链接从first_contour到达其他轮廓。