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++ 的转换)的主要内容,如果未能解决你的问题,请参考以下文章

图像轮廓检测错误:OpenCV、C++

C++ OpenCV轮廓发现

OpenCV 将轮廓设置为 0

使用 OpenCV 中的轮廓点从源图像创建图像?

android如何在 java opencv 中查找最大轮廓

opencv查找轮廓后如何改变轮廓内的颜色C++