samples/cpp/tutorial_code/ImgProc/basic_drawing/Drawing_2.cpp#

An example using drawing functions

  1/**
  2 * @file Drawing_2.cpp
  3 * @brief Simple sample code
  4 */
  5
  6#include <opencv2/core.hpp>
  7#include <opencv2/imgproc.hpp>
  8#include <opencv2/highgui.hpp>
  9#include <iostream>
 10#include <stdio.h>
 11
 12using namespace cv;
 13
 14/// Global Variables
 15const int NUMBER = 100;
 16const int DELAY = 5;
 17
 18const int window_width = 900;
 19const int window_height = 600;
 20int x_1 = -window_width/2;
 21int x_2 = window_width*3/2;
 22int y_1 = -window_width/2;
 23int y_2 = window_width*3/2;
 24
 25/// Function headers
 26static Scalar randomColor( RNG& rng );
 27int Drawing_Random_Lines( Mat image, char* window_name, RNG rng );
 28int Drawing_Random_Rectangles( Mat image, char* window_name, RNG rng );
 29int Drawing_Random_Ellipses( Mat image, char* window_name, RNG rng );
 30int Drawing_Random_Polylines( Mat image, char* window_name, RNG rng );
 31int Drawing_Random_Filled_Polygons( Mat image, char* window_name, RNG rng );
 32int Drawing_Random_Circles( Mat image, char* window_name, RNG rng );
 33int Displaying_Random_Text( Mat image, char* window_name, RNG rng );
 34int Displaying_Big_End( Mat image, char* window_name, RNG rng );
 35
 36
 37/**
 38 * @function main
 39 */
 40int main( void )
 41{
 42  int c;
 43
 44  /// Start creating a window
 45  char window_name[] = "Drawing_2 Tutorial";
 46
 47  /// Also create a random object (RNG)
 48  RNG rng( 0xFFFFFFFF );
 49
 50  /// Initialize a matrix filled with zeros
 51  Mat image = Mat::zeros( window_height, window_width, CV_8UC3 );
 52  /// Show it in a window during DELAY ms
 53  imshow( window_name, image );
 54  waitKey( DELAY );
 55
 56  /// Now, let's draw some lines
 57  c = Drawing_Random_Lines(image, window_name, rng);
 58  if( c != 0 ) return 0;
 59
 60  /// Go on drawing, this time nice rectangles
 61  c = Drawing_Random_Rectangles(image, window_name, rng);
 62  if( c != 0 ) return 0;
 63
 64  /// Draw some ellipses
 65  c = Drawing_Random_Ellipses( image, window_name, rng );
 66  if( c != 0 ) return 0;
 67
 68  /// Now some polylines
 69  c = Drawing_Random_Polylines( image, window_name, rng );
 70  if( c != 0 ) return 0;
 71
 72  /// Draw filled polygons
 73  c = Drawing_Random_Filled_Polygons( image, window_name, rng );
 74  if( c != 0 ) return 0;
 75
 76  /// Draw circles
 77  c = Drawing_Random_Circles( image, window_name, rng );
 78  if( c != 0 ) return 0;
 79
 80  /// Display text in random positions
 81  c = Displaying_Random_Text( image, window_name, rng );
 82  if( c != 0 ) return 0;
 83
 84  /// Displaying the big end!
 85  c = Displaying_Big_End( image, window_name, rng );
 86  if( c != 0 ) return 0;
 87
 88  waitKey(0);
 89  return 0;
 90}
 91
 92/// Function definitions
 93
 94/**
 95 * @function randomColor
 96 * @brief Produces a random color given a random object
 97 */
 98static Scalar randomColor( RNG& rng )
 99{
100  int icolor = (unsigned) rng;
101  return Scalar( icolor&255, (icolor>>8)&255, (icolor>>16)&255 );
102}
103
104
105/**
106 * @function Drawing_Random_Lines
107 */
108int Drawing_Random_Lines( Mat image, char* window_name, RNG rng )
109{
110  Point pt1, pt2;
111
112  for( int i = 0; i < NUMBER; i++ )
113  {
114    pt1.x = rng.uniform( x_1, x_2 );
115    pt1.y = rng.uniform( y_1, y_2 );
116    pt2.x = rng.uniform( x_1, x_2 );
117    pt2.y = rng.uniform( y_1, y_2 );
118
119    line( image, pt1, pt2, randomColor(rng), rng.uniform(1, 10), 8 );
120    imshow( window_name, image );
121    if( waitKey( DELAY ) >= 0 )
122      { return -1; }
123  }
124
125  return 0;
126}
127
128/**
129 * @function Drawing_Rectangles
130 */
131int Drawing_Random_Rectangles( Mat image, char* window_name, RNG rng )
132{
133  Point pt1, pt2;
134  int lineType = 8;
135  int thickness = rng.uniform( -3, 10 );
136
137  for( int i = 0; i < NUMBER; i++ )
138  {
139    pt1.x = rng.uniform( x_1, x_2 );
140    pt1.y = rng.uniform( y_1, y_2 );
141    pt2.x = rng.uniform( x_1, x_2 );
142    pt2.y = rng.uniform( y_1, y_2 );
143
144    rectangle( image, pt1, pt2, randomColor(rng), MAX( thickness, -1 ), lineType );
145
146    imshow( window_name, image );
147    if( waitKey( DELAY ) >= 0 )
148      { return -1; }
149  }
150
151  return 0;
152}
153
154/**
155 * @function Drawing_Random_Ellipses
156 */
157int Drawing_Random_Ellipses( Mat image, char* window_name, RNG rng )
158{
159  int lineType = 8;
160
161  for ( int i = 0; i < NUMBER; i++ )
162  {
163    Point center;
164    center.x = rng.uniform(x_1, x_2);
165    center.y = rng.uniform(y_1, y_2);
166
167    Size axes;
168    axes.width = rng.uniform(0, 200);
169    axes.height = rng.uniform(0, 200);
170
171    double angle = rng.uniform(0, 180);
172
173    ellipse( image, center, axes, angle, angle - 100, angle + 200,
174             randomColor(rng), rng.uniform(-1,9), lineType );
175
176    imshow( window_name, image );
177
178    if( waitKey(DELAY) >= 0 )
179      { return -1; }
180  }
181
182  return 0;
183}
184
185/**
186 * @function Drawing_Random_Polylines
187 */
188int Drawing_Random_Polylines( Mat image, char* window_name, RNG rng )
189{
190  int lineType = 8;
191
192  for( int i = 0; i< NUMBER; i++ )
193  {
194    Point pt[2][3];
195    pt[0][0].x = rng.uniform(x_1, x_2);
196    pt[0][0].y = rng.uniform(y_1, y_2);
197    pt[0][1].x = rng.uniform(x_1, x_2);
198    pt[0][1].y = rng.uniform(y_1, y_2);
199    pt[0][2].x = rng.uniform(x_1, x_2);
200    pt[0][2].y = rng.uniform(y_1, y_2);
201    pt[1][0].x = rng.uniform(x_1, x_2);
202    pt[1][0].y = rng.uniform(y_1, y_2);
203    pt[1][1].x = rng.uniform(x_1, x_2);
204    pt[1][1].y = rng.uniform(y_1, y_2);
205    pt[1][2].x = rng.uniform(x_1, x_2);
206    pt[1][2].y = rng.uniform(y_1, y_2);
207
208    const Point* ppt[2] = {pt[0], pt[1]};
209    int npt[] = {3, 3};
210
211    polylines(image, ppt, npt, 2, true, randomColor(rng), rng.uniform(1,10), lineType);
212
213    imshow( window_name, image );
214    if( waitKey(DELAY) >= 0 )
215      { return -1; }
216  }
217  return 0;
218}
219
220/**
221 * @function Drawing_Random_Filled_Polygons
222 */
223int Drawing_Random_Filled_Polygons( Mat image, char* window_name, RNG rng )
224{
225  int lineType = 8;
226
227  for ( int i = 0; i < NUMBER; i++ )
228  {
229    Point pt[2][3];
230    pt[0][0].x = rng.uniform(x_1, x_2);
231    pt[0][0].y = rng.uniform(y_1, y_2);
232    pt[0][1].x = rng.uniform(x_1, x_2);
233    pt[0][1].y = rng.uniform(y_1, y_2);
234    pt[0][2].x = rng.uniform(x_1, x_2);
235    pt[0][2].y = rng.uniform(y_1, y_2);
236    pt[1][0].x = rng.uniform(x_1, x_2);
237    pt[1][0].y = rng.uniform(y_1, y_2);
238    pt[1][1].x = rng.uniform(x_1, x_2);
239    pt[1][1].y = rng.uniform(y_1, y_2);
240    pt[1][2].x = rng.uniform(x_1, x_2);
241    pt[1][2].y = rng.uniform(y_1, y_2);
242
243    const Point* ppt[2] = {pt[0], pt[1]};
244    int npt[] = {3, 3};
245
246    fillPoly( image, ppt, npt, 2, randomColor(rng), lineType );
247
248    imshow( window_name, image );
249    if( waitKey(DELAY) >= 0 )
250       { return -1; }
251  }
252  return 0;
253}
254
255/**
256 * @function Drawing_Random_Circles
257 */
258int Drawing_Random_Circles( Mat image, char* window_name, RNG rng )
259{
260  int lineType = 8;
261
262  for (int i = 0; i < NUMBER; i++)
263  {
264    Point center;
265    center.x = rng.uniform(x_1, x_2);
266    center.y = rng.uniform(y_1, y_2);
267
268    circle( image, center, rng.uniform(0, 300), randomColor(rng),
269            rng.uniform(-1, 9), lineType );
270
271    imshow( window_name, image );
272    if( waitKey(DELAY) >= 0 )
273      { return -1; }
274  }
275
276  return 0;
277}
278
279/**
280 * @function Displaying_Random_Text
281 */
282int Displaying_Random_Text( Mat image, char* window_name, RNG rng )
283{
284  int lineType = 8;
285
286  for ( int i = 1; i < NUMBER; i++ )
287  {
288    Point org;
289    org.x = rng.uniform(x_1, x_2);
290    org.y = rng.uniform(y_1, y_2);
291
292    putText( image, "Testing text rendering", org, rng.uniform(0,8),
293             rng.uniform(0,100)*0.05+0.1, randomColor(rng), rng.uniform(1, 10), lineType);
294
295    imshow( window_name, image );
296    if( waitKey(DELAY) >= 0 )
297      { return -1; }
298  }
299
300  return 0;
301}
302
303/**
304 * @function Displaying_Big_End
305 */
306int Displaying_Big_End( Mat image, char* window_name, RNG )
307{
308  Size textsize = getTextSize("OpenCV forever!", FONT_HERSHEY_COMPLEX, 3, 5, 0);
309  Point org((window_width - textsize.width)/2, (window_height - textsize.height)/2);
310  int lineType = 8;
311
312  Mat image2;
313
314  for( int i = 0; i < 255; i += 2 )
315  {
316    image2 = image - Scalar::all(i);
317    putText( image2, "OpenCV forever!", org, FONT_HERSHEY_COMPLEX, 3,
318             Scalar(i, i, 255), 5, lineType );
319
320    imshow( window_name, image2 );
321    if( waitKey(DELAY) >= 0 )
322       { return -1; }
323  }
324
325  return 0;
326}