OpenCV学习笔记基础篇(四):基本绘图函数

前言:

笔者目前在校本科大二,有志于进行计算机视觉、计算机图形学方向的研究,准备系统性地、扎实的学习一遍OpenCV的内容,故记录学习笔记,同时,由于笔者同时学习数据结构、机器学习等知识,会尽量根据自己的理解,指出OpenCV的应用,并在加上自己理解的前提下进行叙述。
若有不当之处,希望各位批评、指正。


本篇学习内容:

1.基本绘图函数


1.基本绘图函数

1.1 线

用line()函数来绘制线。

void cv::line	(	
InputOutputArray 	img, 	//作为输出的图片
Point 	pt1,				//点1
Point 	pt2,				//点2
const Scalar & 	color,		//线的颜色
int 	thickness = 1,		//线条宽度
int 	lineType = LINE_8,	//线型。线型和算法有关
int 	shift = 0 			//缩放倍率
)	

有两点需要说明:
1.这个线是画在图上面的,而不是单独创建一个什么Mat矩阵。举例说明:

Mat M = Mat::zeros(600,600,CV_8UC3);
Mat M1 = imread("E:/program/x.jpg");
resize(M1, M1, Size(600, 600));
Point p1(100, 100);
Point p2(200, 200);
line(M, p1, p2, Scalar(255, 129, 0), 2,8,0);
line(M1, p1, p2, Scalar(255, 129, 0), 2,8,0);
imshow("line1", M);
imshow("line2", M1);
waitKey();

在这里插入图片描述
2.函数中的shift参数。shift参数会出现在多个绘图函数中。我注意到很多篇博客都说错了,且官方文档的英文解释我也没看懂。这个参数实际上代表了缩放倍率。会将图案的大小和坐标都缩小到相应的倍率。同样以代码形式来展示:

Mat M = Mat::zeros(600,600,CV_8UC3);
Point p1(100, 100);
Point p2(200, 200);
line(M, p1, p2, Scalar(255, 129, 0), 10, 8, 0);
line(M, p1, p2, Scalar(255, 129, 0), 10, 8, 2);
line(M, p1, p2, Scalar(255, 129, 0), 10, 8, 4);
imshow("line", M);
waitKey();

在这里插入图片描述
这里坐标和线的长度都进行了缩短。但是:把shift改为小数并不会让线条变长;线条的宽度不会有变化;线条的颜色也不会有变化。

1.2 圆

圆和椭圆没什么区别,椭圆的参数更多一些,所以我这里只是把圆的函数放上来展示一下。
使用circle()函数绘制圆。

void cv::circle	(	
InputOutputArray 	img,
Point 	center,
int 	radius,
const Scalar & 	color,
int 	thickness = 1,
int 	lineType = LINE_8,
int 	shift = 0 
)

1.3 椭圆

使用ellipse()函数绘制椭圆。

void cv::ellipse	(	
InputOutputArray 	img,		//作为输出的图像
Point 	center,					//椭圆的中心
Size 	axes,					//椭圆主轴大小的一半。下面单独介绍
double 	angle,					//椭圆旋转角度(用度表示)
double 	startAngle,				//椭圆的起始角
double 	endAngle,				//椭圆的终止角
const Scalar & 	color,			//椭圆的颜色
int 	thickness = 1,			//椭圆线条宽度。如果为负值,则填充椭圆
int 	lineType = LINE_8,		//线型
int 	shift = 0 				//缩放倍率
)	

在这里插入图片描述
关于axes:先以axes的第一个值和圆心center画一个圆。axes的第一个值生成了一个轴(称其为第一轴)。第一轴在angle=0时是水平的。旋转时以顺时针旋转。再以axes的第二个值为椭圆的另一个轴(称其为第二轴)。椭圆角度为0的地方是第一轴的右半部分。
注:可以理解为第一轴初始指向x轴的正向,angle代表顺时针旋转第一轴的角度。但是角度和通常计算角度是相反的(即终边以顺时针旋转)。(参考一下上面的椭圆示意图)
以下是一个例子:

Mat M = Mat::zeros(600,600,CV_8UC3);
resize(M1, M1, Size(600, 600));
ellipse(
	M,
	Point(250, 250),
	Size(100, 200),//第一轴长度100,第二轴长度200
	60,//第一轴旋转60度
	0,
	60,//从起始角0到终止角60画椭圆
	Scalar(255, 129, 0),
	-1,//<0,代表填充椭圆
	8
);
imshow("ellipse", M);
waitKey();

在这里插入图片描述
这里,所谓的第一轴就是扇形右边的边。第二轴就是扇形左边的边。

1.4 其他

还有其他的一些绘图函数,如rectangle()用于绘制矩形,还有fillPoly()等用于绘制多边形的函数,这里便不再赘述。

参考文献:

  1. OpenCV官方文档:https://docs.opencv.org/4.x/
  2. 《OpenCV3编程入门》毛星云、冷雪飞等编著
  3. 《OpenCV4快速入门》冯振、郭延宁、吕跃勇著
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值