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 }
View Code

 

posted @ 2014-11-21 22:46  nipan  阅读(868)  评论(0编辑  收藏  举报