C++ OpenCV:检测两条线而不是一条线(Canny & findContours)
C++ OpenCV: Detecting two lines instead of one (Canny & findContours)
>我目前正在从事一个基于检测图片轮廓的项目。我正在分析仅带有线条的图像,例如此矩形,以及其他图片(也是彩色的)。问题是使用我的代码,我得到一个"两个矩形"的图像,而不是一个。我理解它背后的原因:由于梯度,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
检测四个轮廓而不是两个(对于这两个矩形)?
如果问题出现在其他地方,我很抱歉,如果您向我发送链接,我会很高兴。
任何边缘检测器都能检测到从白色到黑色的过渡,以及从黑色到白色的过渡。这就是为什么在您的生产线中它会检测两条边(线的左侧和右侧)。
如果使用填充的黑色方块进行测试,它将仅检测到一条边缘。黑色背景中的填充白色方块也会发生同样的情况。
对于线检测,霍夫变换可能更好。
对于第二个问题:查找轮廓检测到一个白色方块,里面有一个黑色方块,里面有另一个白色方块,里面有另一个黑色方块。它看不到线条,它只看到一个又一个内部的填充对象。在轮廓对象中,您可以获得正方形的颜色,还可以告诉您轮廓是否在另一个轮廓内。 也许你可以忽略另一个内部的轮廓。
相关文章:
- 如何应用带有cv::cuda和C++的Canny Edge检测器?
- cv::connectedComponents vs cv::findContours 的实现和速度差异
- SFML C++ Canny边缘检测双刃
- 如何使用Canny到32位灰度
- 在OpenCV_core310.dll中使用findContours函数时,OpenCV引发未处理的异常
- OpenCV : findcontours() , 太多的外部轮廓
- Findcontours() 运行时错误
- C++ OpenCV:检测两条线而不是一条线(Canny & findContours)
- OpenCV Canny 之后的 ConvexPoly 不起作用
- OpenCV 3.2.0:读取 Canny 图像以训练 SVM
- 如何仅保留OpenCV Android库的模块(Canny Edge检测)
- iOS - Xcode - OpenCV - findContours error
- 使用FindContours OpenCV时堆错误
- OpenCV findContours of points vector
- OpenCV findContours 导致调试断言在返回时失败
- 在ROI中使用FindContours,将轮廓的坐标错误
- C 中视频的OpenCV Canny边缘检测
- OpenCV "findContours"方法错误
- Opencv Findcontours 会导致堆错误
- 如何证明 findContours 与 cvBlob 做同样的事情