opencv_tutorials学习
随机数发生器&绘制文字
学习知识点:
代码分析:
<span style="font-size:14px;color:#333333;">RNG rng( 0xFFFFFFFF ); </span>
<span style="font-size:14px;color:#333333;">/// 现在我们先画线 c = Drawing_Random_Lines(image, window_name, rng); if( c != 0 ) return 0; /// 继续,这次是一些矩形 c = Drawing_Random_Rectangles(image, window_name, rng); if( c != 0 ) return 0; /// 画一些弧线 c = Drawing_Random_Ellipses( image, window_name, rng ); if( c != 0 ) return 0; /// 画一些折线 c = Drawing_Random_Polylines( image, window_name, rng ); if( c != 0 ) return 0; /// 画被填充的多边形 c = Drawing_Random_Filled_Polygons( image, window_name, rng ); if( c != 0 ) return 0; /// 画圆 c = Drawing_Random_Circles( image, window_name, rng ); if( c != 0 ) return 0; /// 在随机的地方绘制文字 c = Displaying_Random_Text( image, window_name, rng ); if( c != 0 ) return 0; /// Displaying the big end! c = Displaying_Big_End( image, window_name, rng );</span>
<span style="font-size:14px;color:#333333;">int Drawing_Random_Lines( Mat image, char* window_name, RNG rng ) { int lineType = 8; Point pt1, pt2; for( int i = 0; i < NUMBER; i++ ) { pt1.x = rng.uniform( x_1, x_2 ); pt1.y = rng.uniform( y_1, y_2 ); pt2.x = rng.uniform( x_1, x_2 ); pt2.y = rng.uniform( y_1, y_2 ); line( image, pt1, pt2, randomColor(rng), rng.uniform(1, 10), 8 ); imshow( window_name, image ); if( waitKey( DELAY ) >= 0 ) { return -1; } } return 0; }</span>其中,for循环NUMBER次
<span style="font-size:14px;color:#333333;">static Scalar randomColor( RNG& rng ) { int icolor = (unsigned) rng; return Scalar( icolor&255, (icolor>>8)&255, (icolor>>16)&255 ); }</span>
<span style="font-size:14px;color:#333333;">int Displaying_Random_Text( Mat image, char* window_name, RNG rng ) { int lineType = 8; for ( int i = 1; i < NUMBER; i++ ) { Point org; org.x = rng.uniform(x_1, x_2); org.y = rng.uniform(y_1, y_2); putText( image, "Testing text rendering", org, rng.uniform(0,8), rng.uniform(0,100)*0.05+0.1, randomColor(rng), rng.uniform(1, 10), lineType); imshow( window_name, image ); if( waitKey(DELAY) >= 0 ) { return -1; } } return 0; }</span>其中,putText函数说明如下:
字体的粗细范围是从 1 到 10, 表示为 rng.uniform(1,10)
- 在 image 上绘制文字 “Testing text rendering” 。
- 文字的左下角将用点 org 指定。
- 字体参数是用一个在 之间的整数来定义。
- 字体的缩放比例是用表达式 rng.uniform(0, 100)x0.05 + 0.1 指定(表示它的范围是 )。
- 字体的颜色是随机的 (记为 randomColor(rng))。
附录:opencv提供的函数实现(自己写的注释,请谨慎参考)
/** * @file Drawing_2.cpp * @brief Simple sample code */ #include <opencv2/core/core.hpp> //opencv头文件 #include <opencv2/highgui/highgui.hpp> #include <iostream> #include <stdio.h> using namespace cv; //使用命名空间 /// Global Variables const int NUMBER = 100; //定义整形常量 const int DELAY = 5; const int window_width = 900; //窗口大小定义 const int window_height = 600; int x_1 = -window_width/2; int x_2 = window_width*3/2; int y_1 = -window_width/2; int y_2 = window_width*3/2; /// Function headers 函数说明 static Scalar randomColor( RNG& rng ); int Drawing_Random_Lines( Mat image, char* window_name, RNG rng ); int Drawing_Random_Rectangles( Mat image, char* window_name, RNG rng ); int Drawing_Random_Ellipses( Mat image, char* window_name, RNG rng ); int Drawing_Random_Polylines( Mat image, char* window_name, RNG rng ); int Drawing_Random_Filled_Polygons( Mat image, char* window_name, RNG rng ); int Drawing_Random_Circles( Mat image, char* window_name, RNG rng ); int Displaying_Random_Text( Mat image, char* window_name, RNG rng ); int Displaying_Big_End( Mat image, char* window_name, RNG rng ); /** * @function main */ int main( void ) { int c; /// Start creating a window char window_name[] = "Drawing_2 Tutorial"; /// Also create a random object (RNG) RNG rng( 0xFFFFFFFF ); //实例化一个 Random Number Generator(随机数发生器对象) (RNG) Q_yyt:这个没看懂! /// Initialize a matrix filled with zeros 初始化一个数组,填充为0 Mat image = Mat::zeros( window_height, window_width, CV_8UC3 ); /// Show it in a window during DELAY ms imshow( window_name, image ); waitKey( DELAY ); /// Now, let's draw some lines c = Drawing_Random_Lines(image, window_name, rng); if( c != 0 ) return 0; /// Go on drawing, this time nice rectangles c = Drawing_Random_Rectangles(image, window_name, rng); if( c != 0 ) return 0; /// Draw some ellipses c = Drawing_Random_Ellipses( image, window_name, rng ); if( c != 0 ) return 0; /// Now some polylines c = Drawing_Random_Polylines( image, window_name, rng ); if( c != 0 ) return 0; /// Draw filled polygons c = Drawing_Random_Filled_Polygons( image, window_name, rng ); if( c != 0 ) return 0; /// Draw circles c = Drawing_Random_Circles( image, window_name, rng ); if( c != 0 ) return 0; /// Display text in random positions c = Displaying_Random_Text( image, window_name, rng ); if( c != 0 ) return 0; /// Displaying the big end! c = Displaying_Big_End( image, window_name, rng ); if( c != 0 ) return 0; waitKey(0); return 0; } /// Function definitions /** * @function randomColor * @brief Produces a random color given a random object */ static Scalar randomColor( RNG& rng ) { int icolor = (unsigned) rng; return Scalar( icolor&255, (icolor>>8)&255, (icolor>>16)&255 ); } /** * @function Drawing_Random_Lines */ int Drawing_Random_Lines( Mat image, char* window_name, RNG rng )//画随机线条 NUMBER条 { Point pt1, pt2; for( int i = 0; i < NUMBER; i++ ) { pt1.x = rng.uniform( x_1, x_2 ); //产生在x_1 x_2之间均匀分布的随机数 pt1.y = rng.uniform( y_1, y_2 ); pt2.x = rng.uniform( x_1, x_2 ); pt2.y = rng.uniform( y_1, y_2 ); line( image, pt1, pt2, randomColor(rng), rng.uniform(1, 10), 8 ); imshow( window_name, image ); if( waitKey( DELAY ) >= 0 ) { return -1; } } return 0; } /** * @function Drawing_Rectangles */ int Drawing_Random_Rectangles( Mat image, char* window_name, RNG rng ) { Point pt1, pt2; int lineType = 8; int thickness = rng.uniform( -3, 10 ); for( int i = 0; i < NUMBER; i++ ) { pt1.x = rng.uniform( x_1, x_2 ); pt1.y = rng.uniform( y_1, y_2 ); pt2.x = rng.uniform( x_1, x_2 ); pt2.y = rng.uniform( y_1, y_2 ); rectangle( image, pt1, pt2, randomColor(rng), MAX( thickness, -1 ), lineType ); imshow( window_name, image ); if( waitKey( DELAY ) >= 0 ) { return -1; } } return 0; } /** * @function Drawing_Random_Ellipses */ int Drawing_Random_Ellipses( Mat image, char* window_name, RNG rng ) { int lineType = 8; for ( int i = 0; i < NUMBER; i++ ) { Point center; center.x = rng.uniform(x_1, x_2); center.y = rng.uniform(y_1, y_2); Size axes; axes.width = rng.uniform(0, 200); axes.height = rng.uniform(0, 200); double angle = rng.uniform(0, 180); ellipse( image, center, axes, angle, angle - 100, angle + 200, randomColor(rng), rng.uniform(-1,9), lineType ); imshow( window_name, image ); if( waitKey(DELAY) >= 0 ) { return -1; } } return 0; } /** * @function Drawing_Random_Polylines */ int Drawing_Random_Polylines( Mat image, char* window_name, RNG rng ) { int lineType = 8; for( int i = 0; i< NUMBER; i++ ) { Point pt[2][3]; pt[0][0].x = rng.uniform(x_1, x_2); pt[0][0].y = rng.uniform(y_1, y_2); pt[0][1].x = rng.uniform(x_1, x_2); pt[0][1].y = rng.uniform(y_1, y_2); pt[0][2].x = rng.uniform(x_1, x_2); pt[0][2].y = rng.uniform(y_1, y_2); pt[1][0].x = rng.uniform(x_1, x_2); pt[1][0].y = rng.uniform(y_1, y_2); pt[1][1].x = rng.uniform(x_1, x_2); pt[1][1].y = rng.uniform(y_1, y_2); pt[1][2].x = rng.uniform(x_1, x_2); pt[1][2].y = rng.uniform(y_1, y_2); const Point* ppt[2] = {pt[0], pt[1]}; int npt[] = {3, 3}; polylines(image, ppt, npt, 2, true, randomColor(rng), rng.uniform(1,10), lineType); imshow( window_name, image ); if( waitKey(DELAY) >= 0 ) { return -1; } } return 0; } /** * @function Drawing_Random_Filled_Polygons */ int Drawing_Random_Filled_Polygons( Mat image, char* window_name, RNG rng ) { int lineType = 8; for ( int i = 0; i < NUMBER; i++ ) { Point pt[2][3]; pt[0][0].x = rng.uniform(x_1, x_2); pt[0][0].y = rng.uniform(y_1, y_2); pt[0][1].x = rng.uniform(x_1, x_2); pt[0][1].y = rng.uniform(y_1, y_2); pt[0][2].x = rng.uniform(x_1, x_2); pt[0][2].y = rng.uniform(y_1, y_2); pt[1][0].x = rng.uniform(x_1, x_2); pt[1][0].y = rng.uniform(y_1, y_2); pt[1][1].x = rng.uniform(x_1, x_2); pt[1][1].y = rng.uniform(y_1, y_2); pt[1][2].x = rng.uniform(x_1, x_2); pt[1][2].y = rng.uniform(y_1, y_2); const Point* ppt[2] = {pt[0], pt[1]}; int npt[] = {3, 3}; fillPoly( image, ppt, npt, 2, randomColor(rng), lineType ); imshow( window_name, image ); if( waitKey(DELAY) >= 0 ) { return -1; } } return 0; } /** * @function Drawing_Random_Circles */ int Drawing_Random_Circles( Mat image, char* window_name, RNG rng ) { int lineType = 8; for (int i = 0; i < NUMBER; i++) { Point center; center.x = rng.uniform(x_1, x_2); center.y = rng.uniform(y_1, y_2); circle( image, center, rng.uniform(0, 300), randomColor(rng), rng.uniform(-1, 9), lineType ); imshow( window_name, image ); if( waitKey(DELAY) >= 0 ) { return -1; } } return 0; } /** * @function Displaying_Random_Text */ int Displaying_Random_Text( Mat image, char* window_name, RNG rng ) { int lineType = 8; for ( int i = 1; i < NUMBER; i++ ) { Point org; org.x = rng.uniform(x_1, x_2); org.y = rng.uniform(y_1, y_2); putText( image, "Testing text rendering", org, rng.uniform(0,8), rng.uniform(0,100)*0.05+0.1, randomColor(rng), rng.uniform(1, 10), lineType); imshow( window_name, image ); if( waitKey(DELAY) >= 0 ) { return -1; } } return 0; } /** * @function Displaying_Big_End */ int Displaying_Big_End( Mat image, char* window_name, RNG ) { Size textsize = getTextSize("OpenCV forever!", FONT_HERSHEY_COMPLEX, 3, 5, 0); Point org((window_width - textsize.width)/2, (window_height - textsize.height)/2); int lineType = 8; Mat image2; for( int i = 0; i < 255; i += 2 ) { image2 = image - Scalar::all(i); putText( image2, "OpenCV forever!", org, FONT_HERSHEY_COMPLEX, 3, Scalar(i, i, 255), 5, lineType ); imshow( window_name, image2 ); if( waitKey(DELAY) >= 0 ) { return -1; } } return 0; }