OpenCV  3.0.0-rc1
Open Source Computer Vision
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
Creating Bounding boxes and circles for contours

Goal

In this tutorial you will learn how to:

Theory

Code

This tutorial code's is shown lines below. You can also download it from here

1 
7 #include "opencv2/imgcodecs.hpp"
10 #include <iostream>
11 #include <stdio.h>
12 #include <stdlib.h>
13 
14 using namespace cv;
15 using namespace std;
16 
17 Mat src; Mat src_gray;
18 int thresh = 100;
19 int max_thresh = 255;
20 RNG rng(12345);
21 
23 void thresh_callback(int, void* );
24 
28 int main( int, char** argv )
29 {
31  src = imread( argv[1], 1 );
32 
34  cvtColor( src, src_gray, COLOR_BGR2GRAY );
35  blur( src_gray, src_gray, Size(3,3) );
36 
38  const char* source_window = "Source";
39  namedWindow( source_window, WINDOW_AUTOSIZE );
40  imshow( source_window, src );
41 
42  createTrackbar( " Threshold:", "Source", &thresh, max_thresh, thresh_callback );
43  thresh_callback( 0, 0 );
44 
45  waitKey(0);
46  return(0);
47 }
48 
52 void thresh_callback(int, void* )
53 {
54  Mat threshold_output;
55  vector<vector<Point> > contours;
56  vector<Vec4i> hierarchy;
57 
59  threshold( src_gray, threshold_output, thresh, 255, THRESH_BINARY );
61  findContours( threshold_output, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0) );
62 
64  vector<vector<Point> > contours_poly( contours.size() );
65  vector<Rect> boundRect( contours.size() );
66  vector<Point2f>center( contours.size() );
67  vector<float>radius( contours.size() );
68 
69  for( size_t i = 0; i < contours.size(); i++ )
70  { approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );
71  boundRect[i] = boundingRect( Mat(contours_poly[i]) );
72  minEnclosingCircle( contours_poly[i], center[i], radius[i] );
73  }
74 
75 
77  Mat drawing = Mat::zeros( threshold_output.size(), CV_8UC3 );
78  for( size_t i = 0; i< contours.size(); i++ )
79  {
80  Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
81  drawContours( drawing, contours_poly, (int)i, color, 1, 8, vector<Vec4i>(), 0, Point() );
82  rectangle( drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0 );
83  circle( drawing, center[i], (int)radius[i], color, 2, 8, 0 );
84  }
85 
87  namedWindow( "Contours", WINDOW_AUTOSIZE );
88  imshow( "Contours", drawing );
89 }
Scalar_< double > Scalar
Definition: types.hpp:597
void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT)
Blurs an image using the normalized box filter.
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0)
Converts an image from one color space to another.
void minEnclosingCircle(InputArray points, Point2f &center, float &radius)
Finds a circle of the minimum area enclosing a 2D point set.
Mat imread(const String &filename, int flags=IMREAD_COLOR)
Loads an image from a file.
void rectangle(InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
Draws a simple, thick, or filled up-right rectangle.
static MatExpr zeros(int rows, int cols, int type)
Returns a zero array of the specified size and type.
void imshow(const String &winname, InputArray mat)
Displays an image in the specified window.
void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar &color, int thickness=1, int lineType=LINE_8, InputArray hierarchy=noArray(), int maxLevel=INT_MAX, Point offset=Point())
Draws contours outlines or filled contours.
int createTrackbar(const String &trackbarname, const String &winname, int *value, int count, TrackbarCallback onChange=0, void *userdata=0)
Creates a trackbar and attaches it to the specified window.
Definition: imgproc.hpp:409
void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed)
Approximates a polygonal curve(s) with the specified precision.
MatSize size
Definition: mat.hpp:1882
void namedWindow(const String &winname, int flags=WINDOW_AUTOSIZE)
Creates a window.
Definition: imgproc.hpp:309
Size2i Size
Definition: types.hpp:308
for i
Definition: modelConvert.m:63
Random Number Generator.
Definition: core.hpp:2600
Rect boundingRect(InputArray points)
Calculates the up-right bounding rectangle of a point set.
#define CV_8UC3
Definition: cvdef.h:118
Definition: imgproc.hpp:421
double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)
Applies a fixed-level threshold to each array element.
Definition: highgui.hpp:138
void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point())
Finds contours in a binary image.
int main(int argc, const char *argv[])
Definition: facerec_demo.cpp:67
n-dimensional dense array class
Definition: mat.hpp:726
void circle(InputOutputArray img, Point center, int radius, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
Draws a circle.
Point2i Point
Definition: types.hpp:181
convert between RGB/BGR and grayscale, color conversions
Definition: imgproc.hpp:511
int waitKey(int delay=0)
Waits for a pressed key.

Explanation

Result

Here it is:

Bounding_Rects_Circles_Source_Image.jpg
Bounding_Rects_Circles_Result.jpg