OpenCV 中的轮廓比较(从 C 到 C++ 的转换)
Posted
技术标签:
【中文标题】OpenCV 中的轮廓比较(从 C 到 C++ 的转换)【英文标题】:Contour comparison in OpenCV (Convertion from C to C++) 【发布时间】:2013-01-29 08:41:30 【问题描述】:我还是 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 并不完全相同。
【问题讨论】:
您可以描述您如何解决问题并将其发布并接受它作为答案。这样我们就知道了。它已解决,并且 b。你是怎么解决的。 【参考方案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 @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 到达其他轮廓。
【讨论】:
感谢您的建议,但 OpenCV 代码采用C
语言。此外,我已经制作了程序来比较C
中的区域(点击here)。现在我只需要将它转换成 C++,这是我的主要问题。以上是关于OpenCV 中的轮廓比较(从 C 到 C++ 的转换)的主要内容,如果未能解决你的问题,请参考以下文章