OpenCV:如何获得黑白物体的轮廓?

时间:2012-08-07 12:59:00

标签: image-processing opencv contour

我在拍摄照片中的对象轮廓时遇到问题。

为了删除所有噪音,我使用adjustROI()Canny()

我还尝试了erode()dillate()Laplacian()GaussianBlur()Sobel() ...我甚至找到了这段代码片段来锐化图片:

GaussianBlur(src, dst_gaussian, Size(0, 0), 3);

addWeighted(src, 1.5, dst_gaussian, -0.5, 0, dst);

但我的结果总是一样的:我的物体充满了黑白颜色(就像电视屏幕上的噪音一样),因此无法通过findContours()获得轮廓(findContours()找到了一百万个轮廓,但不是整个对象中的一个。我用drawContours()检查了这个。

我使用C ++并将图片加载为灰度Mat(对于Canny,它必须是灰度)。我的物体在每张照片上都有不同的形状,但它始终位于照片的中间。

我要么找到一种方法来通过图像处理获得更好的彩色对象 - 但我不知道还有什么可以尝试 - 或者如何在图像处理后用颜色填充对象(没有它的轮廓,因为这是我最终想要的。)

欢迎任何想法。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我找到了一种适用于大多数情况的解决方案。我使用概率Hough变换填充我的对象HoughLinesP()

vector<Vec4i> lines;
HoughLinesP(dst, lines, 1, CV_PI/180, 80, 30, 10);
for(size_t i = 0; i < lines.size(); i++)
{
    line(color_dst, Point(lines[i][0], lines[i][1]), Point(lines[i][2], lines[i][3]), Scalar(0,0,255), 3, 8);
}

这是来自OpenCV文档提供的一些示例代码。

使用一些边缘检测算法(如Canny())后,概率Hough变换在二进制图片中找到对象。该算法找到线条,如果绘制线条,则代表整个对象。当然,有些参数必须适用于某种图片。

我不确定这是否适用于每张照片或每件物品,但就我而言,确实如此。