Opencv轮廓错误

时间:2013-06-27 11:23:15

标签: c++ opencv

我想找到我的图像的轮廓然后我想用openCV绘制轮廓。我正在使用VS 2012和OpenCV 2.4.5 我写了关于查找轮廓和绘制轮廓的示例代码。 我堆积了那个可怕的错误:)对于任何帮助我将不胜感激

void MyClass::findContoursAndDraw(cv::Mat image,int b,int g,int r)
{
findContours(image,contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);
for(int i=0;i<contours.size();i++)
{
    int size=cv::contourArea(contours[i]);
    if(size>500)
    {
        printf("%i \n",size);
        drawContours(originalTemp,contours,i,cv::Scalar(b,g,r),2,8);        
    }

}

}

void MyClass::findContoursAndDrawFilled(cv::Mat image,int b,int g,int r)
{
findContours(image,contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);
for(int i=0;i<contours.size();i++)
{
    int size=cv::contourArea(contours[i]);
    if(size>3000)
    {
        printf("%i \n",size);
        drawContours(originalImg,contours,i,cv::Scalar(b,g,r));     
    }

}
}

我的门槛和其他必要功能非常有效。但我的程序堆积在寻找轮廓和drawcontour功能。说:

 Unhandled exception at 0x00B3A52A (opencv_imgproc245d.dll) in OpencvTest.exe: 
 0xC0000005: Access violation reading location 0xCDCDCDCD

1 个答案:

答案 0 :(得分:1)

我有一个类似的问题。但有两种隐含的情况。

第一个是绘图问题,我复制了官方文档包含的解决方式:

    findContours( src, contours, hierarchy, CV_RETR_CCOMP, 
                 CV_CHAIN_APPROX_SIMPLE );
    // iterate through all the top-level contours,
    // draw each connected component with its own random color
    int idx = 0;
    for( ; idx >= 0; idx = hierarchy[idx][0] )
    {
      Scalar color( rand()&255, rand()&255, rand()&255 );
      drawContours( dst, contours, idx, color, CV_FILLED, 8, hierarchy );
    }

这对我来说可以为每个轮廓绘制不同的颜色。


编辑:此功能“drawContours”可以为轮廓和所有孩子绘制颜色。要更好地理解这一点,请阅读this


第二个是轮廓上的迭代导航。由于一些不明原因,“findContours(...)”函数的输出“轮廓”使轮廓具有0大小或非常高的大小(就像内存捶打,非常大的数字)。我使用条件解决了使用轮廓的方式:

    for(int i=0;i<contours.size();i++)
    {
    if(contours[i].size() < 10000 && contours[i].size() > 0)
       {
       int size=cv::contourArea(contours[i]);
       if(size>3000)
          {
        printf("%i \n",size);
        drawContours(originalImg,contours,i,cv::Scalar(b,g,r));     
          }
       }
    }

我使用条件“if(contours [i] .size()&lt; 10000&amp;&amp; contours [i] .size()&gt; 0)”因为在任何情况下,我们操纵“轮廓[ i]“,其中”contours [i] .size()“为0或那么大的数字,程序CRASHES。 (“10000”是任意的,在我的情况下工作)。