Ask Your Question
-1

Creating Bounding boxes for contours

asked 2018-05-12 11:16:06 -0600

kasra gravatar image

I used this code to draw "Bounding boxes". Now I want the largest rectangle while there are many rectangles. After finding the largest rectangle, I want to have the coordinates of this rectangle. By these coordinates, I want to be a part of the original image.The largest rectangle is my car.

#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/videoio.hpp"
#include <opencv2/highgui.hpp>
#include <opencv2/video.hpp>
#include <iostream>
#include <sstream> 
#include <fstream>
using namespace cv;
using namespace std;

Mat src; Mat src_gray;
int thresh = 0;
int max_thresh = 255;
RNG rng(12345);

/// Function header
void thresh_callback(int, void*);
/** @function thresh_callback */
void thresh_callback(int, void*)
{
    Mat threshold_output;
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;

    /// Detect edges using Threshold
    threshold(src_gray, threshold_output, thresh, 255, THRESH_BINARY);
    /// Find contours
    findContours(threshold_output, contours, hierarchy, CV_RETR_TREE, 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]));
        minEnclosingCircle((Mat)contours_poly[i], center[i], radius[i]);
    }


    /// Draw polygonal contour + bonding rects + circles
    Mat drawing = Mat::zeros(threshold_output.size(), CV_8UC3);
    for (int i = 0; i< contours.size(); i++)
    {
        Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(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);
    }

    /// Show in a window
    namedWindow("Contours", CV_WINDOW_AUTOSIZE);
    imshow("Contours", drawing);
}
/** @function main */
int main(int argc, char** argv)
{
    /// Load source image and convert it to gray
    src = imread("RGB2YCrCb_BC_SB.png");
    /// Convert image to gray and blur it
    cvtColor(src, src_gray, CV_BGR2GRAY);
    blur(src_gray, src_gray, Size(3, 3));
    /// Create Window
    char* source_window = "Source";
    namedWindow(source_window, CV_WINDOW_AUTOSIZE);
    imshow(source_window, src);


    thresh_callback(0, 0);

    waitKey(0);
    return(0);
}

I have worked hard and I have searched a lot.Please help if you can. See the picture. image description

edit retag flag offensive close merge delete

1 answer

Sort by ยป oldest newest most voted
0

answered 2018-05-12 11:57:10 -0600

berak gravatar image

updated 2018-05-12 13:54:00 -0600

so, you already found out about contours & boundingRects, great !

now the only thing left is to find the largest one, which is not difficult at all:

double maxArea = 0; // keep track of the largest size
int maxId = -1;     // which one.
for (size_t i = 0; i < contours.size(); i++)
{
      double area = boundRect[i].width * boundRect[i].height;
      if (area > maxArea) 
      {
            maxArea = area;
            maxId = i;
      }
}
if (maxId != -1)
{ 
      // safe to assume, that contours[maxId] is the largest of them !
      rectangle(drawing, boundRect[maxId].tl(), boundRect[maxId].br(), Scalar(0,200,0), 2, 8, 0);
} // else assume, it did not find any contours at all. can't rule that out !
edit flag offensive delete link more

Comments

Dear friends, Thank you very much for your reply. You gave me a great favor and solved my problem. Please tell me, can I have a large rectangular coordinate? I want to use these coordinates in the original image.

kasra gravatar imagekasra ( 2018-05-12 18:02:36 -0600 )edit

you want to lookup, what a Rect actually is ... (aka: read docs, NOT ask around !)

that's also the reason for downvoting your question.

(if you really have to ask this, it's obvious, that you never wrote the code above, and that you don't understand anything going on there.)

berak gravatar imageberak ( 2018-05-12 18:09:10 -0600 )edit

Question Tools

1 follower

Stats

Asked: 2018-05-12 11:16:06 -0600

Seen: 450 times

Last updated: May 12 '18