我目前正在开发一个基于检测图片轮廓的项目。我只使用线条分析图像,例如this rectangle,以及其他图片(也是彩色图片)。问题是使用我的代码我得到一个image of "two rectangles"而不是一个。我理解它背后的原因:由于渐变,Canny检测到线条两侧的边缘。但是,有没有办法删除其中一个矩形(或其他图片中的线条)或将它们合并为一个?
我的代码片段:
cvtColor(source, imgGray, CV_RGB2GRAY);
GaussianBlur(imgGray, imgGauss, Size(5, 5), 1);
Canny(imgGauss, imgCanny, 100, 200);
findContours(imgCanny, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
Mat imgDraw = Mat::zeros(imgCanny.size(), CV_8UC3);
for (int i = 0; i< contours.size(); i++)
{
Scalar color(255, 255, 255);
drawContours(imgDraw, contours, i, color, 1.5, 8, hierarchy, 0);
cout << "Hierarchy: " << hierarchy[i] << endl;
for (int j = 0; j < contours[i].size(); j++)
{
cout << contours[i][j] << endl;
}
}
我已尝试在CV_RETR_CCOMP
中使用findContours
模式,如示例代码 for drawContours
function中所示,但我得到的结果相同。
我可能会尝试几何图形比较,但据我所知,有更复杂的形状(例如人脸)不会起作用。
另一个问题,为什么findContours
检测到四个轮廓而不是两个(对于那两个矩形)?
对不起,如果问题出现在其他地方,如果你发给我链接,我会很高兴。
答案 0 :(得分:0)
任何边缘检测器都会检测从白色到黑色的过渡以及从黑色到白色的过渡。这就是为什么在你的行中它会检测到两条边(线的左侧和右侧)。
如果使用填充的黑色方块进行测试,它将仅检测到一条边。在黑色背景中填充白色方块也是如此。
对于线路检测,Hough变换可能更好。
对于第二个问题:找到轮廓检测到一个白色正方形,里面有一个黑色正方形,里面有另一个白色正方形,里面有另一个黑色正方形。它没有看到线条,它只看到一个在另一个里面的填充物体。在轮廓对象中,您可以获得正方形的颜色,并且它还可以告诉您轮廓是否在另一个内部。也许你可以忽略另一个内部的轮廓。