OpenCV笔记(五)——基本的绘图操作
用OpenCV的话,也要会一些绘图的操作。主要是画线、圆、矩形、椭圆。
绘图的话,首先要了解两种类型:Point和Scalar。
Point就是点的类,我们用它来表示图像当中的点,比如Point pt; pt.x = 10; pt.y = 8;或者Point pt = Point(10, 8);
Scalar实质上就是4维的向量,也就是C++当中的含有4个元素的vector。一般我们只用到三维,比如Scalar(0, 0, 255);
一、线
void line(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
pt1表示线段的起始点。
pt2表示线段的终止点。
color表示线段的颜色。
lineType有三种类型:8连接的线、4连接的线,经过高斯平滑的线。分别是8, 4, CV_AA。
shift暂时不清楚有什么用,默认为0就好。
二、圆
void circle(Mat& img, Point center, int radius, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
center表示圆心坐标。
radius表示半径。
thickness为圆的曲线的厚度,如果thickness为负数,则圆被填满。
lineType的意思和line()函数当中lineType的意思一样。
三、矩形
void rectangle(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, lineType=8, int shift=0)
pt1和pt2是对角线上的两个点
void rectangle(Mat& img, Rect rec, const Scalar& color, int thickness=1, lineType=8, int shift=0)
Rect是矩形类型,一般以x, y, width, height初始化,比如 Rect rect(10, 10, 200, 100),表示从点(10,10)开始,宽200高100的矩形
四、椭圆
void ellipse(Mat& img, Point center, Size axes, double angle, double startAngle, double endAngle, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
要知道axes的意思,首先要知道Size。Size是尺寸类型,一般以width, height初始化,Size size(50, 20)表示宽度为50,高度为20。axes是axis的复数形式,Size的第一个参数表示长半轴的长度,第二个参数表示短半轴的长度。
angle是椭圆相对图像的角度。
startAngle和endAngle是椭圆的圆弧的角度,0到360,说明是整个椭圆。0到180,只有半个椭圆。OpenCV采取逆时针绘制。
void ellipse(Mat& img, RotatedRect& box, const Scalar& color, int thickness=1, int lineType=8, int shift=0)
box给出一个旋转的矩形,然后ellipse方法给出在矩形的内接椭圆。RotatedRect(const Point2f& center, const Size2f& size, float angle)
用box给椭圆初始化和用axes+angle的差别在于:box中RotatedRect的Size是矩形的宽度和高度,而axes是椭圆的半轴的长度。
附OpenCV官方指南当中绘图操作的实例代码:
1 /** 2 * @file Drawing_1.cpp 3 * @brief Simple sample code 4 */ 5 6 #include <opencv2/core/core.hpp> 7 #include <opencv2/highgui/highgui.hpp> 8 9 #define w 400 10 11 using namespace cv; 12 13 /// Function headers 14 void MyEllipse( Mat img, double angle ); 15 void MyFilledCircle( Mat img, Point center ); 16 void MyPolygon( Mat img ); 17 void MyLine( Mat img, Point start, Point end ); 18 19 /** 20 * @function main 21 * @brief Main function 22 */ 23 int main( void ){ 24 25 /// Windows names 26 char atom_window[] = "Drawing 1: Atom"; 27 char rook_window[] = "Drawing 2: Rook"; 28 29 /// Create black empty images 30 Mat atom_image = Mat::zeros( w, w, CV_8UC3 ); 31 Mat rook_image = Mat::zeros( w, w, CV_8UC3 ); 32 33 /// 1. Draw a simple atom: 34 /// ----------------------- 35 36 /// 1.a. Creating ellipses 37 MyEllipse( atom_image, 90 ); 38 MyEllipse( atom_image, 0 ); 39 MyEllipse( atom_image, 45 ); 40 MyEllipse( atom_image, -45 ); 41 42 /// 1.b. Creating circles 43 MyFilledCircle( atom_image, Point( w/2, w/2) ); 44 45 /// 2. Draw a rook 46 /// ------------------ 47 48 /// 2.a. Create a convex polygon 49 MyPolygon( rook_image ); 50 /* 51 /// 2.b. Creating rectangles 52 rectangle( rook_image, 53 Point( w, w), 54 Point( 0, 7*w/8 ), 55 56 Scalar( 0, 255, 255 ), 57 -1, 58 8 ); 59 */ 60 Rect rec(0, 7*w/8, w, 1*w/8); 61 rectangle(rook_image, rec, Scalar(0, 255, 255), -1, 8); 62 /// 2.c. Create a few lines 63 MyLine( rook_image, Point( 0, 15*w/16 ), Point( w, 15*w/16 ) ); 64 MyLine( rook_image, Point( w/4, 7*w/8 ), Point( w/4, w ) ); 65 MyLine( rook_image, Point( w/2, 7*w/8 ), Point( w/2, w ) ); 66 MyLine( rook_image, Point( 3*w/4, 7*w/8 ), Point( 3*w/4, w ) ); 67 68 /// 3. Display your stuff! 69 imshow( atom_window, atom_image ); 70 moveWindow( atom_window, 0, 200 ); 71 imshow( rook_window, rook_image ); 72 moveWindow( rook_window, w, 200 ); 73 74 waitKey( 0 ); 75 return(0); 76 } 77 78 /// Function Declaration 79 80 /** 81 * @function MyEllipse 82 * @brief Draw a fixed-size ellipse with different angles 83 */ 84 void MyEllipse( Mat img, double angle ) 85 { 86 int thickness = 2; 87 int lineType = 8; 88 89 ellipse( img, 90 //Point( w/2, w/2 ), 91 //Size( w/4, w/16 ), 92 //angle, 93 //0, 94 //360, 95 RotatedRect(Point( w/2, w/2 ),Size( w/2, w/8 ),angle), 96 Scalar( 255, 0, 0 ), 97 thickness, 98 lineType ); 99 /* 100 ellipse( img, 101 Point( w/2, w/2 ), 102 Size( w/4, w/16 ), 103 angle, 104 0, 105 360, 106 Scalar( 255, 0, 0 ), 107 thickness, 108 lineType ); 109 */ 110 } 111 112 /** 113 * @function MyFilledCircle 114 * @brief Draw a fixed-size filled circle 115 */ 116 void MyFilledCircle( Mat img, Point center ) 117 { 118 int thickness = -1; 119 int lineType = CV_AA; 120 121 circle( img, 122 center, 123 w/32, 124 Scalar( 0, 0, 255 ), 125 thickness, 126 lineType, 127 0); 128 } 129 130 /** 131 * @function MyPolygon 132 * @function Draw a simple concave polygon (rook) 133 */ 134 void MyPolygon( Mat img ) 135 { 136 int lineType = 8; 137 138 /** Create some points */ 139 Point rook_points[1][20]; 140 rook_points[0][0] = Point( w/4, 7*w/8 ); 141 rook_points[0][1] = Point( 3*w/4, 7*w/8 ); 142 rook_points[0][2] = Point( 3*w/4, 13*w/16 ); 143 rook_points[0][3] = Point( 11*w/16, 13*w/16 ); 144 rook_points[0][4] = Point( 19*w/32, 3*w/8 ); 145 rook_points[0][5] = Point( 3*w/4, 3*w/8 ); 146 rook_points[0][6] = Point( 3*w/4, w/8 ); 147 rook_points[0][7] = Point( 26*w/40, w/8 ); 148 rook_points[0][8] = Point( 26*w/40, w/4 ); 149 rook_points[0][9] = Point( 22*w/40, w/4 ); 150 rook_points[0][10] = Point( 22*w/40, w/8 ); 151 rook_points[0][11] = Point( 18*w/40, w/8 ); 152 rook_points[0][12] = Point( 18*w/40, w/4 ); 153 rook_points[0][13] = Point( 14*w/40, w/4 ); 154 rook_points[0][14] = Point( 14*w/40, w/8 ); 155 rook_points[0][15] = Point( w/4, w/8 ); 156 rook_points[0][16] = Point( w/4, 3*w/8 ); 157 rook_points[0][17] = Point( 13*w/32, 3*w/8 ); 158 rook_points[0][18] = Point( 5*w/16, 13*w/16 ); 159 rook_points[0][19] = Point( w/4, 13*w/16 ); 160 161 const Point* ppt[1] = { rook_points[0] }; 162 int npt[] = { 20 }; 163 164 fillPoly( img, 165 ppt, 166 npt, 167 1, 168 Scalar( 255, 255, 255 ), 169 lineType ); 170 } 171 172 /** 173 * @function MyLine 174 * @brief Draw a simple line 175 */ 176 void MyLine( Mat img, Point start, Point end ) 177 { 178 int thickness = 2; 179 int lineType = 8; 180 line( img, 181 start, 182 end, 183 Scalar( 0, 0, 0 ), 184 thickness, 185 lineType, 186 0); 187 }