0

你好 StackOverflowers

我创建了一个应用程序,它使用 inRange 函数根据预定义的颜色分割图像。然后我在检测到的对象周围绘制边界框。

我的问题是如何确定区域属性,例如:面积、大小、高度和中心点。

在这里,我放置了一个屏幕转储示例.....

在此处输入图像描述

我应该如何检索这些边界框或任何其他被淹没的边界框的区域属性......?

vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;
    findContours(mBlur, contours, hierarchy, CV_RETR_EXTERNAL,  CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );



     /// Approximate contours to polygons + get bounding rects and circles
  vector<vector<Point> > contours_poly( contours.size() );
  vector<Rect> boundRect( contours.size() );
  vector<Point2f>center( contours.size() );
  vector<float>radius( contours.size() );

  for( int i = 0; i < contours.size(); i++ )
     { approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );
       boundRect[i] = boundingRect( Mat(contours_poly[i]) );
     }


  /// Draw polygonal contour + bonding rects
  Mat drawing = Mat::zeros( range_out.size(), CV_8UC3 );
  for( int i = 0; i< contours.size(); i++ )
     {
       Scalar color = Scalar(255,0,255);
       drawContours( drawing, contours_poly, i, color, 1, 8, vector<Vec4i>(), 0, Point() );
       rectangle( drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0 );
     }

问候

4

4 回答 4

2

只需遍历分段形状的 2D 坐标(图片中的粉红色细线,您可以发现它只是检查哪些像素不是黑色并查看其坐标)并存储找到的最大和最小 X 和 Y。那么,宽度是maxX - minX,高度是maxY - minY

于 2013-02-08T19:47:23.577 回答
2

您可以使用内置的 OpenCV函数获取该区域。还有其他功能可以满足您的一切需求。

于 2013-02-08T21:52:20.883 回答
0
void visualizeSegments(Mat& img, Mat& dst)
{
    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;
    findContours(img, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
    dst=Mat::zeros(img.size(), CV_8UC3);
    for(int i = 0; i < contours.size(); i++)
    { 
        //Moments mu = moments(contours[i], true );
        //Point2f centroid(mu.m10/mu.m00,mu.m01/mu.m00);        
        //double area = fabs(contourArea(Mat(contours[i])));
        //vector<Point> contours_poly;
        //approxPolyDP(Mat(contours[i]), contours_poly, 3, true);
        //Rect boundRect = boundingRect(Mat(contours_poly));
        drawContours(dst, contours, i, Scalar(255,0,0), -1, 8, hierarchy);
    }
}
于 2013-02-10T04:54:57.560 回答
0

如前所述,OpenCV中有一组有用的函数 1. double contourArea(InputArray contour, bool oriented=false ) :计算面积 2. double arcLength(InputArray curve, bool closed) :计算周长 3. 力矩(InputArray 数组, bool binaryImage=false ) : 计算重心 4. void HuMoments(const Moments& m, OutputArray hu) : 如果你想要对分类有用的附加属性

于 2013-02-10T16:13:32.777 回答