2

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

例如,在此图像中,它没有检测到任何三角形

在此处输入图像描述

我正在使用的代码是这样的:

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 的问题,我检测完整的三角形没有问题。我不知道我是否可以做一些事情来检测那种“不完整的三角形”,或者我必须做一些事情来完成三角形,这样我才能检测到它们。无论哪种情况,我都有点迷路

谢谢您的帮助

编辑:我忘了上传图片

4

2 回答 2

1

实际上,三角形的opencv边在视觉方面可能很困难,但我会建议一些可以帮助你实现的方法。

1)使用角落检测器

OpenCV Canny)检测二进制图像中的所有角落。我会说使用形态学操作(扩张和 Errode)作为减少噪声而不是模糊或非最大抑制的手段。接下来使用极值点,并将其连接起来形成三角形。因为可能会有很多角,您可以尝试拟合所有点并选择最大拟合。您也可以使用 delaunay 三角测量来找到点的三角形。

2) 使用曲率信息。 由于缺少三角形的一条边,您可以使用两条边来计算外接轮廓的曲率。同样在这里,形态学运算(扩张和腐蚀)可能很有用。您可以选择曲率(计算二值图像轮廓的曲率)急剧变化的点,如顶点一样的极值点,并拟合线以获得三角形的近似值。如果您的图像噪音较小,您可以使用Convex Hull来获得近似值。

3) RANSAC Fitting 您也可以使用Fitting方法通过使用三角形的变体来逼近三角形,并将其拟合到二值图像上的2个估计边缘。

于 2015-04-06T16:02:45.020 回答
1

主题很旧-但可能对其他人有所帮助。我有同样的问题,但我在输入图像上使用 dilate() 函数处理了它(如果三角形有很大的间隙,它可能需要 2-3 次迭代)。这不是最好的解决方案,但目前似乎是最简单的解决方案。

于 2017-08-28T17:26:53.923 回答