我想找到我的图像的轮廓然后我想用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
答案 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”是任意的,在我的情况下工作)。