3

我编写了一个在单通道空白图像中绘制圆、线和矩形的代码。之后,我只是找出图像中的轮廓,并且我得到了正确的所有轮廓。但是在找到轮廓后,我的源图像变得扭曲了。为什么会这样?任何人都可以帮我解决它。我的代码如下所示。

using namespace cv;
using namespace std;
int main()
{

    Mat dst = Mat::zeros(480, 480, CV_8UC1);
    Mat draw= Mat::zeros(480, 480, CV_8UC1);

    line(draw, Point(100,100), Point(150,150), Scalar(255,0,0),1,8,0);
    rectangle(draw, Rect(200,300,10,15),  Scalar(255,0,0),1, 8,0); 
    circle(draw, Point(80,80),20, Scalar(255,0,0),1,8,0);

    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;

    findContours( draw, contours, hierarchy,CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );

     for( int i = 0; i< contours.size(); i++ )
    {
        Scalar color( 255,255,255);
        drawContours( dst, contours, i, color, 1, 8, hierarchy );
    }

    imshow( "Components", dst );
    imshow( "draw", draw );

    waitKey(0);
}

源图像

在此处输入图像描述

找到轮廓后的失真源

4

4 回答 4

11

文档清楚地说明了使用 findContours 时源图像被更改。

http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=findcontours#findcontours

见第一注。

如果您需要源图像,则必须在副本上运行 findContours。

于 2013-06-18T11:47:11.747 回答
2

尝试使用 findContours( draw.clone(), contours, hierarchy,CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );

于 2016-07-12T17:37:28.480 回答
1

我认为问题在于您期望 findContours 得到一个完美的情节,它给您一个丑陋的图画。

FindContours 不会给出你的数字的精确图。您必须使用 drawContours 才能生成正确的图像。

在这里查看参考:http: //docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight= findcontours#findcontours

可以看到第一个参数是 Input/Output 数组。所以该函数使用相同的数组来打开、修改和保存图像。这就是为什么你会得到一个扭曲的图像。

另见参数说明。当它谈到第一个参数时,它说:“该函数在提取轮廓的同时修改图像。”

我没有用 findContours 做很多工作,但我从来没有清楚地知道我想要什么。我必须始终使用 drawContours 来获得一个很好的情节。

否则你可以使用 Canny 函数,它会给你边缘而不是轮廓。

于 2013-06-18T09:29:56.247 回答
1

对我来说,第二张图像看起来像我所期望的边缘检测算法的结果。我的猜测是 findContours 函数会用找到的结果覆盖原始图像。

看看这里

于 2013-06-18T09:34:58.900 回答