OpenCV笔记(五)——基本的绘图操作
发布日期:2021-08-25 00:32:40 浏览次数:4 分类:技术文章

本文共 6633 字,大约阅读时间需要 22 分钟。

用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 
7 #include
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 MyFilledCircle114 * @brief Draw a fixed-size filled circle115 */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 MyPolygon132 * @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 MyLine174 * @brief Draw a simple line175 */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

 

转载于:https://www.cnblogs.com/nipan/p/4114392.html

转载地址:https://blog.csdn.net/weixin_33836223/article/details/94467841 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:delphi 线程的使用
下一篇:监控服务zabbix部署

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年03月31日 06时25分23秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

【大话Mysql面试】-Mysql如何恢复数据?如何进行主从复制?Binlog日志到底是什么? 2019-04-26
理解String.intern()和String类常量池疑难解析例子 2019-04-26
python flask打造前后端分离的口罩检测 2019-04-26
【大话Mysql面试】-MySQL基础知识 2019-04-26
【大话Mysql面试】-MySQL数据类型有哪些 2019-04-26
【大话Mysql面试】-MySQL数据引擎 2019-04-26
【大话Mysql面试】-常见SQL语句书写 2019-04-26
【大话Mysql面试】-SQL语句优化 2019-04-26
【大话Mysql面试】-Mysql事务以及隔离级别 2019-04-26
【大话Mysql面试】-Mysql索引 2019-04-26
【大话Mysql面试】-Mysql锁 2019-04-26
【大话Mysql面试】-Mysql常见面试题目 2019-04-26
08 【多线程高并发】Java线程间通信的方式 2019-04-26
【数据结构与算法】什么是跳表?通俗易懂来理解跳表 2019-04-26
【数据结构与算法】什么是图?图是什么?快速带你回顾图有关的知识点 2019-04-26
【数据结构与算法】什么是串?什么是KMP算法?字符串匹配是什么? 2019-04-26
【数据结构与算法】什么是布隆过滤器?如何防止缓存穿透的问题? 2019-04-26
【Java锁体系】CopyOnWriteArrayList是什么?线程安全的arraylist是哪个? 2019-04-26
【面试题目】Java设计模式你有哪些了解?说几个常用的。 2019-04-26
【计算机操作系统】常说的死锁是什么?死锁产生的必要条件是什么?死锁的解决策略是什么? 2019-04-26