Tomazi
Tomazi

Reputation: 781

Calculating the area of Bounding Box

Hello StackOverflowers

I have created an application that Segments an image on the basis of a predefined color using inRange function. I then draw bounding box around the detected object.

My question here is how do I determine region properties such as: area, size, height and with, center point.

Here i placed a screen dump example.....

enter image description here

How should i approach to retrieve region properties of these bounding boxes or any other bounding boxes that get drown.......?

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 );
     }

Regards

Upvotes: 0

Views: 5513

Answers (4)

Tobias Senst
Tobias Senst

Reputation: 2830

As stated befor there are a set of usefull functions in OpenCV 1. double contourArea(InputArray contour, bool oriented=false ) : to comute the area 2. double arcLength(InputArray curve, bool closed) : to compute the perimeter 3. Moments moments(InputArray array, bool binaryImage=false ) : to compute the center of gravity 4. void HuMoments(const Moments& m, OutputArray hu) : if you want additional properties that is usefull for classification

Upvotes: 0

Zaw Lin
Zaw Lin

Reputation: 5708

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);
    }
}

Upvotes: 0

b_m
b_m

Reputation: 1533

You can get the area by using the built in OpenCV function. There are other functions there too to get everything you need.

Upvotes: 2

Dan
Dan

Reputation: 1486

Just iterate over the 2D coordinates of the segmented shape (the thin pink line in your pictures, you can found this just checking which pixels are not black and looking into its coordinates) and store maximum and minimum X and Y found. Then, width of is maxX - minX and height is maxY - minY

Upvotes: 2

Related Questions