首页 > 代码库 > OpenCV官方文档学习记录(4)
OpenCV官方文档学习记录(4)
基本图形的绘制,官方文档给了一个实例,绘制下面两幅图形,分别使用了圆,椭圆,矩形,多边形,线等构造。
主要是使我们了解到如何构建这些形状,以及如何使用两种数据类型Point和Scalar分别定义点和颜色;
先放图:
完整代码如下:
1 #include <opencv2\opencv.hpp> 2 #include <iostream> 3 #include <string> 4 5 #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) 6 7 using namespace std; 8 using namespace cv; 9 10 void Show(std::string name,Mat img) 11 { 12 namedWindow(name, CV_WINDOW_AUTOSIZE); 13 imshow(name, img); 14 } 15 16 //画线的自定义函数 17 void MyLine(Mat img, Point start, Point end) 18 { 19 int thickness = 2; 20 int linetype = 8; 21 22 //Scalar是用BGR来进行混合的调色类,0,0,0表示黑色 23 line(img, start, end, Scalar(0, 0, 0), thickness, linetype); 24 } 25 26 //画椭圆 27 void MyEllipse(Mat img, double angle) 28 { 29 int w = 400; 30 int thickness = 2; 31 int linetype = 8; 32 33 //参数2是椭圆圆心,参数3是宽度和高度(就是长半轴和短半轴的长度), 34 //参数4是旋转角度,参数5,6是圆绘制的起始角度(就是圆线的起始位置), 35 //其余参数类似 36 ellipse(img, 37 Point(w / 2.0, w / 2.0), 38 Size(w / 4.0, w / 16.0), 39 angle, 40 0, 41 360, 42 Scalar(255, 0, 0),//蓝色 43 thickness, 44 linetype); 45 } 46 47 void MyPolygon(Mat img) 48 { 49 int w = 400; 50 int linetype = 8; 51 52 //创建多边形的顶点集合 53 Point root_points[1][20]; 54 root_points[0][0] = Point(w / 4.0, 7 * w / 8.0); 55 root_points[0][1] = Point(3 * w / 4.0, 7 * w / 8.0); 56 root_points[0][2] = Point(3 * w / 4.0, 13 * w / 16.0); 57 root_points[0][3] = Point(11 * w / 16.0, 13 * w / 16.0); 58 root_points[0][4] = Point(19 * w / 32.0, 3 * w / 8.0); 59 root_points[0][5] = Point(3 * w / 4.0, 3 * w / 8.0); 60 root_points[0][6] = Point(3 * w / 4.0, w / 8.0); 61 root_points[0][7] = Point(26 * w / 40.0, w / 8.0); 62 root_points[0][8] = Point(26 * w / 40.0, w / 4.0); 63 root_points[0][9] = Point(22 * w / 40.0, w / 4.0); 64 root_points[0][10] = Point(22 * w / 40.0, w / 8.0); 65 root_points[0][11] = Point(18 * w / 40.0, w / 8.0); 66 root_points[0][12] = Point(18 * w / 40.0, w / 4.0); 67 root_points[0][13] = Point(14 * w / 40.0, w / 4.0); 68 root_points[0][14] = Point(14 * w / 40.0, w / 8.0); 69 root_points[0][15] = Point(w / 4.0, w / 8.0); 70 root_points[0][16] = Point(w / 4.0, 3 * w / 8.0); 71 root_points[0][17] = Point(13 * w / 32.0, 3 * w / 8.0); 72 root_points[0][18] = Point(5 * w / 16.0, 13 * w / 16.0); 73 root_points[0][19] = Point(w / 4.0, 13 * w / 16.0); 74 75 const Point* ppt[1] = { root_points[0] }; 76 int npt[] = { 20 }; 77 78 //建立一个被填充的多边形 79 //参数2是所有顶点的集合,参数3是每个多边形顶点个数的集合,参数4是要绘制的多边形的个数,其余参数类似 80 fillPoly(img, 81 ppt, 82 npt, 83 1, 84 Scalar(255, 255, 255), 85 linetype); 86 } 87 88 void MyFiledCircle(Mat img, Point center) 89 { 90 int w = 400; 91 int thickness = -1;//一旦此参数为-1.表明此时形状是被填充颜色而非边缘画线 92 int linetype = 8; 93 94 //与构造椭圆的参数相同 95 circle(img, 96 center, 97 w / 32.0, 98 Scalar(0, 0, 255), 99 thickness,100 linetype);101 }102 int main()103 {104 int w = 400;//窗口大小105 106 //窗口名称107 char atom_window[] = "Drawing 1 : Atom";108 char rook_window[] = "Drawing 2 : Rook";109 110 //用0填充图形矩阵。并规定图像大小111 Mat atom_img = Mat::zeros(w, w, CV_8UC3);112 Mat rook_img = Mat::zeros(w, w, CV_8UC3);113 114 115 //draw a simple atom116 117 //以下四行是画椭圆,第二参数是旋转角度118 MyEllipse(atom_img, 90);119 MyEllipse(atom_img, 0);120 MyEllipse(atom_img, 45);121 MyEllipse(atom_img, -45);122 123 //画中心的圆,第二参数是圆心位置124 MyFiledCircle(atom_img, Point(w / 2.0, w / 2.0));125 126 127 //draw a rook128 129 //绘制多边形130 MyPolygon(rook_img);131 132 //绘制矩形,2参和3参是矩形左上和右下点,4参数是矩形颜色,-1是线粗细(填充图形),8是线类型133 rectangle(rook_img,134 Point(0, 7 * w / 8.0),135 Point(w, w),136 Scalar(0, 255, 255),137 -1,138 8);139 140 141 //画线,参数2和3分别是起止点142 MyLine(rook_img, Point(0, 15 * w / 16), Point(w, 15 * w / 16));143 MyLine(rook_img, Point(w/4, 7 * w / 8), Point(w/4, w));144 MyLine(rook_img, Point(w/2, 7 * w / 8), Point(w/2, w));145 MyLine(rook_img, Point(3*w/4, 7 * w / 8), Point(3*w/4, w));146 147 148 Show(atom_window, atom_img);149 Show(rook_window, rook_img);150 151 imwrite("./after/atom.jpg", atom_img);152 imwrite("./after/rook.jpg", rook_img);153 154 waitKey();155 return 0;156 }
注释已经解释得很明白了,如果不明白,请参阅2.4.9官方文档opencv_tutorialo.pdf的156页及以后。
输出结果:
以上。
OpenCV官方文档学习记录(4)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。