C++ OpenCV:检测两条线而不是一条线(Canny & findContours)

C++ OpenCV: Detecting two lines instead of one (Canny & findContours)

本文关键字:Canny findContours 一条 OpenCV 检测 两条线 C++      更新时间:2023-10-16

>我目前正在从事一个基于检测图片轮廓的项目。我正在分析仅带有线条的图像,例如此矩形,以及其他图片(也是彩色的)。问题是使用我的代码,我得到一个"两个矩形"的图像,而不是一个。我理解它背后的原因:由于梯度,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;
}
}

我尝试在findContours中使用CV_RETR_CCOMP模式,就像drawContours函数的示例代码一样,但我得到了相同的结果。

我可能会尝试几何图形比较,但据我所知,更复杂的形状(例如人脸)是行不通的。

另一个问题,为什么findContours检测四个轮廓而不是两个(对于这两个矩形)?

如果问题出现在其他地方,我很抱歉,如果您向我发送链接,我会很高兴。

任何边缘检测器都能检测到从白色到黑色的过渡,以及从黑色到白色的过渡。这就是为什么在您的生产线中它会检测两条边(线的左侧和右侧)。

如果使用填充的黑色方块进行测试,它将仅检测到一条边缘。黑色背景中的填充白色方块也会发生同样的情况。

对于线检测,霍夫变换可能更好。

对于第二个问题:查找轮廓检测到一个白色方块,里面有一个黑色方块,里面有另一个白色方块,里面有另一个黑色方块。它看不到线条,它只看到一个又一个内部的填充对象。在轮廓对象中,您可以获得正方形的颜色,还可以告诉您轮廓是否在另一个轮廓内。 也许你可以忽略另一个内部的轮廓。