2015-04-06 33 views
2

我尝试通过它们的颜色和形状来检测交通标志,我从de颜色分割中获得二值图像,并尝试检测其中的三角形,除非三角形的所有边都完整ÿ不工作,检测不完整/完美的三角形

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

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的问题,我没有问题检测完整的三角形。我不知道我是否可以做一些事情来检测那种“不完整的三角形”,或者我将不得不做一些事情来完成三角形,以便我可以检测到它们。在这两种情况下,我有点失落

谢谢您的帮助

编辑:我忘了上传图片

回答

1

其实,三角形在视觉方面也许很难的OpenCV的一面,但我会建议一些可能会帮助你实现的方法。

1)使用检测器角

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

2)使用曲率信息。 由于三角形的一条边缺失,因此可以使用2条边来计算外接轮廓的曲率。在这里,形态操作(Dilate and Errode)也是有用的。比你可以选择点曲率(Computing the Curvature of Binary Image Contour)作为顶点的极端点,并拟合线来逼近三角形。如果你的图像不太不精确,你可以使用Convex Hull来获得近似值。

3)RANSAC拟合 也可以使用拟合方法通过使用三角形的变体来近似的三角形,它适合于二进制图像上的2个估计边缘。

+0

我试图做凸起,它检测到更多的三角形(当双方的某些部分失踪它有时仍然失败),但现在我得到了很多图像中的误报,在没有任何遥远相似的地方到一个三角形 我会尝试使用曲率检测,关于RANSAC我不太清楚那是什么,我没有找到一个好的教程,你能告诉我在哪里可以学到更多的知识吗? – Kailegh 2015-04-13 15:19:38

1

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