【转载】OpenCV-Python系列之OpenCV中的绘图功能(七)

在图像中我们经常需要用到将某个局部特征画出来,比如物体检测,物体追踪等等,今天来看看有哪些好玩的绘图工具吧!

画线

首先要为画的线创造出环境,就要生成一个空的黑底图像。我们使用numpy进行实验:

	view plaincopy to clipboardprint?
 1. import cv2   
 2. import numpy as np      
 3. img=np.zeros((512,512,3),np.uint8)   
 4. cv2.imshow("img",img)   
 5. cv2.waitKey(0)  
 6. cv2.destroyAllWindows()

【转载】OpenCV-Python系列之OpenCV中的绘图功能(七)_第1张图片

这是黑色的底,我们的画布,我把窗口名叫做img,np.zeros()有两个参数,一个是创建的图片矩阵大小,另一个是数据类型,512,512是像素(第一个512像素高,第二个是512像素宽),3指BGR三种颜色

uint8是用0-255表示所有颜色。

我们看一下画线函数的原型:

cv2.line(img,start,end,color,thickness)

img是要操作的图片,start和end是画线的两端点,color是线的颜色,thickness是线的粗细程度。

函数实例:

	view plaincopy to clipboardprint?
1.cv2.line(img,(0,0),(511,511),(255,0,0),5)  

这个函数有5个参数,分别为:img是图像名称,(0,0)为起点坐标,(511,511)为终点坐标,(255,0,0)是蓝色,5是线的宽度

会画一条 从左上方到右下角的蓝色线段,我们看实验效果:

【转载】OpenCV-Python系列之OpenCV中的绘图功能(七)_第2张图片

画矩形

画矩形函数将是十分重要的环节,在以后的实际操作项目中,我们基本上就会发现,OpenCV使用最多的绘图函数,就是画矩形函数,它使用范围非常广泛,包括画轮廓,实时跟踪目标时我们也是使用画矩形函数对跟踪的目标进行标注。接下来我们先了解一下矩形函数:

cv2.rectangle(img,(50,50),(400,400),(0,0,255),3)

这个函数有5个参数,img为图像名称,(50,50)为左上顶点坐标,(400,400)为右下顶点坐标,(0,255,0)代表绿色,线宽为3。

画矩形两个要素:左上顶点和右下顶点坐标。

我们来看一下代码:

	view plaincopy to clipboardprint?
1.import cv2  
2.import numpy as np  
3.
4.img = np.zeros((512, 512, 3), np.uint8)  
5.cv2.rectangle(img,(50,50),(400,400),(0,0,255),3)  
6.
7.cv2.imshow("img", img)  
8.cv2.waitKey(0)  
9.cv2.destroyAllWindows()  

实验效果:

【转载】OpenCV-Python系列之OpenCV中的绘图功能(七)_第3张图片

画圆

函数:

cv2.circle(img,(447,63), 63, (0,0,255), -1)

这个函数有5个参数:图像名称,圆心坐标,半径63,(0,0,255)红色,线宽为-1,当线宽-1时表示封闭图形的颜色填充。

画圆的两要素:指定圆形的中心点坐标和半径大小

代码:

	view plaincopy to clipboardprint?
1.import cv2  
2.import numpy as np  
3.
4.img=np.zeros((512,512,3), np.uint8)  
5.cv2.circle(img,(256,256), 63, (0,0,255), -1)  
6.cv2.imshow("img",img)  
7.cv2.waitKey(0)  
8.cv2.destroyAllWindows() 

演示效果:

【转载】OpenCV-Python系列之OpenCV中的绘图功能(七)_第4张图片

画椭圆

函数原型:

cv2.ellipse(img,center,axes,angle,start_angle,end_angle,color,thickness,line_type,shift)

img是操作的图片、center是椭圆的中心的,axes是椭圆的长轴和短轴、angle是偏转角度、start_angle和end_angle分别是圆弧的起始角度和终结角度、color是线条颜色、thickness是线条粗细程度、line_type是线条的类型、shift是圆心坐标点和数轴的精度。

给出一个函数实例:

cv2.ellipse(img,(256,256),(100,50),0,0,180,255,-1)

这个函数有8个参数:img为图像名称,(256,256)为中心点坐标,100为长轴长度,50为短轴长度,0旋转角度,图像出现的部分(长轴顺时针方向起始的角度和结束角度)0,180是下半个椭圆,颜色数组这里255是蓝色。-1则为实心,大于0的数值则为空心,线条宽度由自己决定。

画椭圆的几个要素:1.是中心点的位置坐标 2.长轴和短轴的长度 3.椭圆沿逆时针方向旋转的角度 4.长轴顺时针方向起始的角度和结束角度

代码:

	view plaincopy to clipboardprint?
1.import cv2  
2.import numpy as np  
3.
4.img=np.zeros((512,512,3), np.uint8)  
5.cv2.ellipse(img,(256,256),(100,50),0,0,180,255,-1)  
6.cv2.imshow("img",img)  
7.cv2.waitKey(0)  
8.cv2.destroyAllWindows()  

演示效果:

【转载】OpenCV-Python系列之OpenCV中的绘图功能(七)_第5张图片

现在我们画出整个椭圆,将代码中倒数第三个参数由180修改为360就可以了:

cv2.ellipse(img,(256,256),(100,50),0,0,360,255,-1)

【转载】OpenCV-Python系列之OpenCV中的绘图功能(七)_第6张图片

若想画出空心圆,只需要将最后一个参数修改为正值,即为线宽:

	view plaincopy to clipboardprint?
1.cv2.ellipse(img,(256,256),(100,50),0,0,360,255,4)  

效果:

【转载】OpenCV-Python系列之OpenCV中的绘图功能(七)_第7张图片

画多边形

OpenCV中可以通过API进而画出多边形,其函数实例为:

pts=np.array([[20,20],[350,40],[420,400],[60,420]], np.int32)

pts = pts.reshape((-1,1,2))

img = cv2.polylines(img,[pts],True,(0,255,0),2)

cv2. polylines()有5个参数:图像名称,顶点列表(这个多边形在array中有四个顶点),True表示闭合,(0,255,255)是黄色,3是线宽。pts则是使用numpy构建的四个顶点的数组,这个数组的数据类型必须为 int32。

代码:

	view plaincopy to clipboardprint?
1.import cv2  
2.import numpy as np  
3.  
4.img = np.zeros((512, 512, 3), np.uint8)  
5.pts=np.array([[20,20],[350,40],[420,400],[60,420]], np.int32)  
6.pts=pts.reshape((-1,1,2))  
7.cv2.polylines(img,[pts],True,(0,255,0),2)  
8.  
9.cv2.imshow("img", img)  
10.cv2.waitKey(0)  
11.cv2.destroyAllWindows()  

效果演示:

【转载】OpenCV-Python系列之OpenCV中的绘图功能(七)_第8张图片

如果我修改顶点数组的顺序,就会得到不一样的结果:

	view plaincopy to clipboardprint?
1.pts=np.array([[20,20],[350,40],[60,420],[420,400]], np.int32)  

效果:

【转载】OpenCV-Python系列之OpenCV中的绘图功能(七)_第9张图片

在图片上添加文字

使用OpenCV我们可以在图像上添加文字,函数实例为:

font=cv2.FONT_HERSHEY_SIMPLEX

cv2.putText(img,‘OpenCV’,(10,250), font, 4,(255,255,255),2)

这个函数有八个参数,分别为:图像名称,字符串,坐标,字体,字号,(255,255,255)为白色、线宽为2。

当然,OpenCV是不支持添加中文的,要想添加中文的文字,可以添加中文的字库,也可以使用PIL来进行操作。官方解释不支持汉字是为了保持库的简单和轻量, 并且表明以后也不会支持中文,所以大家还是尽量使用英文,毕竟我们以后也是需要使用英文来阅读大量的文档的。

代码:

	view plaincopy to clipboardprint?
1.import cv2  
2.import numpy as np  
3.  
4.img=np.zeros((512,512,3), np.uint8)  
5.font=cv2.FONT_HERSHEY_SIMPLEX  
6.cv2.putText(img,'OpenCV',(10,250), font, 4,(255,255,255),2)  
7.  
8.cv2.imshow("img",img)  
9.cv2.waitKey(0)  
10.cv2.destroyAllWindows() 

效果演示为;

【转载】OpenCV-Python系列之OpenCV中的绘图功能(七)_第10张图片

至此,OpenCV的绘图功能基本上就这些了,需要特别注意的是:

所 有 的 绘 图 函 数 的 返 回 值 都 是 None, 所 以 不 能 使 用 类似:img =cv2.line(img,(0,0),(511,511),(255,0,0),5),绘图函数直接调用即可。

查看文章汇总页https://blog.csdn.net/weixin_44237705/article/details/107864965

更多openvino技术信息可以入群交流~
【转载】OpenCV-Python系列之OpenCV中的绘图功能(七)_第11张图片

你可能感兴趣的:(python,opencv,计算机视觉,人工智能)