检测不完整/完美的三角形

时间:2015-04-06 09:48:41

标签: c++ opencv detect complete triangular

我尝试通过它们的颜色和形状来检测交通标志,我有来自颜色分割的二进制图像,我尝试检测其中的三角形,除非三角形的所有边都完整y不起作用,

例如,在此图像中

它没有检测到任何三角形

enter image description here

我正在使用的代码是:

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的问题,我检测完整的三角形没有问题。我不知道我能做些什么来检测那种“不完整的三角形”,或者我必须做些什么来完成三角形以便我能够检测到它们。无论哪种情况,我都有点迷失

感谢您的帮助

编辑:我忘了上传图片

2 个答案:

答案 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次迭代)。它不是最好的解决方案,但目前似乎是最简单的解决方案。