Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在等高线openCV中查找直线_Android_Opencv_Contour - Fatal编程技术网

Android 在等高线openCV中查找直线

Android 在等高线openCV中查找直线,android,opencv,contour,Android,Opencv,Contour,我正在使用android openCV,我想检测图像中的三角形、矩形和圆形。因此,我按如下方式操作:Canny=>findContours=>approxPolyDP并获得此图像: 然而,approxPolyDP的结果包含了太多的顶点,所以我无法确定它是哪个形状。为了消除顶点,我想检测每个轮廓中的线条并找到它们的交点。如何对单个轮廓执行此操作?对于圆检测,请使用 在这里,您只需要寻找简化的多边形(三角形和正方形)。你试过在approxPolyDP中调整epsilon吗 下面是openCV中的一

我正在使用android openCV,我想检测图像中的三角形、矩形和圆形。因此,我按如下方式操作:Canny=>findContours=>approxPolyDP并获得此图像:


然而,approxPolyDP的结果包含了太多的顶点,所以我无法确定它是哪个形状。为了消除顶点,我想检测每个轮廓中的线条并找到它们的交点。如何对单个轮廓执行此操作?

对于圆检测,请使用

在这里,您只需要寻找简化的多边形(三角形和正方形)。你试过在approxPolyDP中调整epsilon吗

下面是openCV中的一个示例片段-查看近似精度(epsilon,approxPolyDP的第三个参数)是如何相对于轮廓大小设置的

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);
          }
      }
//测试每个轮廓
对于(size_t i=0;i1000&&
isContourConvex(材料(近似)))
{
双最大余弦=0;
对于(int j=2;j<5;j++)
{
//求关节边之间角度的最大余弦
双余弦=fabs(角度(约[j%4],约[j-2],约[j-1]);
最大余弦=最大值(最大余弦,余弦);
}
//如果所有角度的余弦都很小
//(所有角度约为90度)然后写入量子线
//结果序列的顶点
如果(最大余弦<0.3)
正方形。推回(大约);
}
}

红色圆圈也算作圆圈吗?我问这个问题是因为它们有开放的轮廓,这就是为什么,因此理想情况下不符合圆的条件……红色的圆实际上是C字母:),我用Core.putText绘制,我们不必担心。有比使用HoughCircles更好的方法来检测圆。检查这些和