android – 在轮廓openCV中找到直线

我正在使用 android openCV,我想检测图像中的三角形,矩形和圆形.所以我这样做:Canny => findContours => approxpolyDP并获取图片
Image Hosted by ImageShack.us http://imageshack.us/a/img839/8100/device20130114224716.png

但是,approxpolyDP的结果包含很多顶点,所以我无法确定它是哪个形状.为了消除顶点,我想检测每个轮廓中的线并找到它们的交点.如何为单个轮廓做到这一点?

解决方法

对于圆圈检测,请使用 HoughCircles.

然后在这里你只是寻找简化的多边形(三角形和正方形).你试过在aptpolyDP中调整epsilon吗?

以下是openCV squares.cpp sample code的示例代码段 – 了解近似精度(epsilon,aboutpolyDP的第三个参数)是如何相对于轮廓的大小设置的.

C代码,但openCV接口应该是相同的,所以我确信它可以直接适应您的环境.

// test each contour
  for( size_t i = 0; i < contours.size(); i++ )
      {
          // approximate contour with accuracy proportional
          // to the contour perimeter
      approxpolyDP(Mat(contours[i]),approx,arcLength(Mat(contours[i]),true)*0.02,true);

          // square contours should have 4 vertices after approximation
          // relatively large area (to filter out noisy contours)
          // and be convex.
          // Note: absolute value of an area is used because
          // area may be positive or negative - in accordance with the
          // contour orientation
      if( approx.size() == 4 &&
         fabs(contourArea(Mat(approx))) > 1000 &&
         isContourConvex(Mat(approx)) )
          {
          double maxCosine = 0;

          for( int j = 2; j < 5; j++ )
              {
                  // find the maximum cosine of the angle between joint edges
              double cosine = fabs(angle(approx[j%4],approx[j-2],approx[j-1]));
              maxCosine = MAX(maxCosine,cosine);
              }

              // if cosines of all angles are small
              // (all angles are ~90 degree) then write quandrange
              // vertices to resultant sequence

          if( maxCosine < 0.3 )
              squares.push_back(approx);
          }
      }

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...