1

我想找到我的图像的轮廓,然后我想使用 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));     
    }

}
}

我的阈值和其他必要的功能运作良好。但是我的程序堆积在寻找轮廓和绘制轮廓功能上。说:

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

1 回答 1

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”可以为轮廓和所有子项绘制颜色。要更好地理解这一点,请阅读内容。


第二个是轮廓上的迭代导航。由于某些未知的原因,“findContours(...)”函数的输出“contours”会带来 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() < 10000 && contours[i].size() > 0)”,因为无论如何,当我们操作“contours[i]”时,其中“contours[ i].size()" 为 0 或那个大数字,程序崩溃。(“10000”是任意的,在我的情况下有效)。

于 2013-07-14T06:58:28.757 回答