【问题标题】:Detect not complete/perfect triangles检测不完整/完美的三角形
【发布时间】:2015-06-10 16:59:03
【问题描述】:

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

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

我使用的代码是这样的:

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

感谢您的帮助

编辑:我忘了上传图片

【问题讨论】:

    标签: c++ opencv image-processing feature-detection triangular


    【解决方案1】:

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

    1) 使用角检测器

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

    2) 使用曲率信息。 由于缺少三角形的一条边,您可以使用两条边来计算外接轮廓的曲率。再次,形态学运算 (Dilate and Errode) 很有用。您可以选择曲率 (Computing the Curvature of Binary Image Contour) 像顶点一样剧烈变化的点,并拟合线以获得三角形的近似值。如果您的图像噪音较小,您可以使用Convex Hull 来获得近似值。

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

    【讨论】:

    • 我尝试做凸包,它检测到更多的三角形(当侧面的某些部分丢失时,它有时仍然失败)但是现在我在图像中得到了很多误报,在某些地方没有什么与三角形非常相似,我将尝试使用曲率检测,关于 RANSAC,我不太清楚那是什么,也没有找到好的教程,你能告诉我在哪里可以了解更多信息吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-26
      • 2014-08-14
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 2022-08-23
      • 2016-02-06
      • 2022-01-12
      相关资源
      最近更新 更多