我编写的代码在单个通道空白图像中绘制圆形,直线和矩形。之后,我只是找出图像中的轮廓,我正确地得到了所有的轮廓。但在找到轮廓后,我的源图像变得扭曲。为什么会这样?任何人都可以帮我解决。我的代码如下所示。
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);
}
来源图片
找到轮廓后扭曲的来源
答案 0 :(得分:11)
文档清楚地指出使用findContours时源图像会被更改。
见第一个注释。
如果您需要源图像,则必须在副本上运行findContours。
答案 1 :(得分:2)
尝试使用
findContours( draw.clone(), contours, hierarchy,CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
答案 2 :(得分:1)
我认为问题在于你期待findContours的完美情节,它给你一个丑陋的画。
FindContours不会给出你的数字的确切情节。您必须使用drawContours才能生成正确的图像。
您可以看到第一个参数是输入/输出数组。因此该函数使用相同的数组来打开,修改和保存图像。这就是为什么你会得到一个扭曲的图像。
另外请参阅参数说明。当它谈到第一个参数时,它说:&#34;该功能在提取轮廓时修改图像。&#34;
我用findContours做了很多工作,但我从来没有清楚地了解我想要的东西。我必须始终使用drawContours来获得一个很好的情节。
否则你可以使用Canny功能,它会给你边缘而不是轮廓。
答案 3 :(得分:1)
对我来说,第二张图像看起来就像我期望的边缘检测算法。我的猜测是findContours函数用找到的结果覆盖原始图像。
看看here。