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 rotated boxes and ellipses 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<RotatedRect> minRect( contours.size() );
65  vector<RotatedRect> minEllipse( contours.size() );
66 
67  for( size_t i = 0; i < contours.size(); i++ )
68  { minRect[i] = minAreaRect( Mat(contours[i]) );
69  if( contours[i].size() > 5 )
70  { minEllipse[i] = fitEllipse( Mat(contours[i]) ); }
71  }
72 
74  Mat drawing = Mat::zeros( threshold_output.size(), CV_8UC3 );
75  for( size_t i = 0; i< contours.size(); i++ )
76  {
77  Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
78  // contour
79  drawContours( drawing, contours, (int)i, color, 1, 8, vector<Vec4i>(), 0, Point() );
80  // ellipse
81  ellipse( drawing, minEllipse[i], color, 2, 8 );
82  // rotated rectangle
83  Point2f rect_points[4]; minRect[i].points( rect_points );
84  for( int j = 0; j < 4; j++ )
85  line( drawing, rect_points[j], rect_points[(j+1)%4], color, 1, 8 );
86  }
87 
89  namedWindow( "Contours", WINDOW_AUTOSIZE );
90  imshow( "Contours", drawing );
91 }
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.
Mat imread(const String &filename, int flags=IMREAD_COLOR)
Loads an image from a file.
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.
RotatedRect minAreaRect(InputArray points)
Finds a rotated rectangle of the minimum area enclosing the input 2D point set.
void ellipse(InputOutputArray img, Point center, Size axes, double angle, double startAngle, double endAngle, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
Draws a simple or thick elliptic arc or fills an ellipse sector.
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 line(InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
Draws a line segment connecting two points.
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
#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
RotatedRect fitEllipse(InputArray points)
Fits an ellipse around a set of 2D points.
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
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_Rotated_Ellipses_Source_Image.jpg
Bounding_Rotated_Ellipses_Result.jpg