我尝试通过它们的颜色和形状来检测交通标志,我有来自颜色分割的二进制图像,我尝试检测其中的三角形,除非三角形的所有边都完整y不起作用,
例如,在此图像中它没有检测到任何三角形
我正在使用的代码是:
vector<Point> approx;
findContours(copia,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE);
vector<Rect_ <int> > boundRect( contours.size() );
vector<Rect_ <int> > boundRect_( contours.size() );
for(size_t i=0; i<contours.size();i++)
{
approxPolyDP(Mat(contours[i]), approx,arcLength(Mat(contours[i]), true)*0.02, true);
if (approx.size() == 3 &&fabs(contourArea(Mat(approx))) > 300 && isContourConvex(Mat(approx)))
drawContours(capture->image,contours,i,Scalar(0,255,0));
这不是cotourArea的问题,我检测完整的三角形没有问题。我不知道我能做些什么来检测那种“不完整的三角形”,或者我必须做些什么来完成三角形以便我能够检测到它们。无论哪种情况,我都有点迷失
感谢您的帮助
编辑:我忘了上传图片
答案 0 :(得分:1)
实际上,三角形的opencv方面在视觉方面可能很难,但我建议一些方法可以帮助你实现。
1)使用角点检测器
(OpenCV Canny)检测二进制图像中的所有角落。我会说使用形态学操作(Dilate and Errode)作为降低噪声而非模糊或非最大抑制的手段。下一步使用极值点,并将其连接以形成三角形。因为可能会有许多角落,您可以尝试拟合所有点并选择最大拟合。您也可以使用delaunay三角测量来找到点的三角形。
2)使用曲率信息 由于缺少三角形的一条边,您可以使用2条边来计算外接轮廓的曲率。在此,形态学操作(Dilate and Errode)可能很有用。你可以选择曲率(Computing the Curvature of Binary Image Contour)急剧变化的点作为极点作为顶点和拟合线以获得近似于traiangle的点。如果您的图像噪音较小,则可以使用Convex Hull来获得近似值。
3)RANSAC适合 您也可以使用Fitting方法通过使用三角形变量来逼近三角形,并将其拟合到二进制图像上的2个估计边缘。
答案 1 :(得分:1)
主题陈旧 - 但可能会帮助其他人。 我有同样的问题,但我在输入图像上使用dilate()函数处理它(如果三角形有很大的间隙,它可能需要2-3次迭代)。它不是最好的解决方案,但目前似乎是最简单的解决方案。