计算边界框的面积

时间:2013-02-08 19:43:30

标签: c++ opencv

Hello StackOverflowers

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

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

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

enter image description here

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

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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

迭代分割形状的2D坐标(图片中的粉红色细线,您可以发现这只是检查哪些像素不是黑色并查看其坐标)并存储找到的最大和最小X和Y.然后,宽度为maxX - minX,高度为maxY - minY

答案 2 :(得分: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);
    }
}

答案 3 :(得分:0)

如上所述,OpenCV中有一组有用的功能  1. double contourArea(InputArray contour,bool oriented = false):计算区域  2. double arcLength(InputArray曲线,bool关闭):计算周长  3.时刻(InputArray数组,bool binaryImage = false):计算重心  4. void HuMoments(const Moments&amp; m,OutputArray hu):如果你想要对分类有用的其他属性