1. opencv的绘图函数都有相同的参数,所以现列举所有的绘图函数,统一介绍其参数
- cv2.line():划线
- cv2.circle():划圆
- cv2.ellipse():画椭圆
- cv2.rectangle():画矩形
- cv2.polylines():画多边形
- cv2.putText():图片上添加文字
所有的函数都有如下参数:
- img:你想要绘制图像的那幅图像
- color:形状的颜色,传入一个元组RGB格式,例如:(255,0,0)
- thickness:线条的粗细(整数)。默认值是1,若=-1,则填表填充(前提是闭合图形)
- linetype:线条的类型,8连接,抗锯齿等。默认情况是8连接。cv2.LINE_AA:为抗锯齿
- shift:精度(一般不填,按默认处理)
2. 特殊的,每个函数还有各自的特殊参数:
- cv2.line(img,pt1,pt2,color,thickness,lineType, shift):画直线
- pt1:画线的起始坐标,比如(10,20)
- pt2:画线的终点坐标,比如(50,90)
# 在img上从(10,10)到(120,120)画一条直线,颜色为蓝色(255,0,0),粗细=2,线条为抗锯齿类型
cv2.line(img,(10,10),(120,120),(255,0,0),2,cv2.LINE_AA)
- cv2.circle(img,center,radius,color,thickness,lineType, shift):画圈
- center:圆的圆心坐标,比如(50,50)
- radius:圆的半径(整型)
# 在img上画圆,以坐标(50,50)为圆心,30为半径,线条粗心=2
cv2.circle(img,(50,50),30,(255,0,0),2)
# 在img上画圆,以坐标(50,50)为圆心,30为半径,并且圆为实心圆(thickness=-1表示填充)
cv2.circle(img,(50,50),30,(255,0,0),-1)
- cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness, lineType, shift):画椭圆
- center:椭圆的中心坐标(元组)
- axes:椭圆的长短轴组成的元组,例如长轴=20,短轴=10,则axes=(20,10)
- angle:椭圆倾斜的角度(整型)
- startAngle & endAngle:通过这两个参数,我们可以控制是否完全显示椭圆,如果设置为startAngle=0,endAngle=360,表示该椭圆全部被绘制,若startAngle=0,endAngle=180,该椭圆只有一半被绘制,若startAngle=0,endAngle=90,该椭圆的四分之一被绘制
# 下图第一个圈,绘制整个椭圆(0~360°)
cv2.ellipse(img,(50,50),(20,10),45,0,360,(255,0,0),2)
# 下图第二个圈,绘制部分椭圆(0~180°)
cv2.ellipse(img,(50,50),(20,10),45,0,180,(255,0,0),2)
# 下图第三个圈,绘制部分椭圆(0~90°)
cv2.ellipse(img,(50,50),(20,10),45,0,90,(255,0,0),2)
- cv2.rectangle(img,pt1,pt2,color,thickness,lineType, shift=None):画矩形
- pt1:矩形左上角的坐标(元组)
- pt2:矩形右下角的坐标(元组)
- cv2.polylines(img, pts, isClosed, color, thickness=None, lineType=None, shift):画多边形
- pts:一个int32类型的二维数组,详见下面例子
- isClosed:是否封闭该多边形(即是否首尾相连)
pos=[(1,1),(1,100),(200,200)] # 定义多边形几个顶点的坐标
pos = np.array(pos, np.int32).reshape((-1, 1, 2)) #转换为np类型,形状为(n,1,2),即n个行1列2的数组
imgRet = cv2.polylines(img, [pos], False, (0, 255, 0), 3) # 注意pos要添加[],否则图中只会描绘顶点,而不是互相连接
cv2.imshow('image', img)
cv2.waitKey(0)
- putText(img, text, org, fontFace, fontScale, color, thickness, lineType, bottomLeftOrigin):图片上添加文字
- text:要添加的文字(str)
- org:要添加的坐标位置,是从文字的头文字坐标计算(元组)
- fontFace:字体类型(具体可选项见下表)
- fontScale:字体大小
- bottomLeftOrigin:即与lineType一样
cv2.FONT_HERSHEY_SIMPLEX | 正常大小无衬线字体. |
cv2.FONT_HERSHEY_PLAIN | 小号无衬线字体. |
cv2.FONT_HERSHEY_DUPLEX | 正常大小无衬线字体比 CV_FONT_HERSHEY_SIMPLEX 更复杂) |
cv2.FONT_HERSHEY_COMPLEX | 正常大小有衬线字体. |
cv2.FONT_HERSHEY_TRIPLEX | 正常大小有衬线字体 ( 比 CV_FONT_HERSHEY_COMPLEX更复杂) |
cv2.FONT_HERSHEY_COMPLEX_SMALL | CV_FONT_HERSHEY_COMPLEX 的小译本. |
cv2.FONT_HERSHEY_SCRIPT_SIMPLEX | 手写风格字体. |
cv2.FONT_HERSHEY_SCRIPT_COMPLEX | 比 CV_FONT_HERSHEY_SCRIPT_SIMPLEX 更复杂. |
cv2.FONT_ITALIC | 字体标记合成。就是斜体字. |
# 这里字体选择了cv2.FONT_HERSHEY_SCRIPT_SIMPLEX,字体大小2,线条宽度2
cv2.putText(imgBgr,'this is a text',(10,500),cv2.FONT_HERSHEY_SCRIPT_SIMPLEX,2,(255,0,0),2)
3. 总结
请尝试画出下图:
参考代码:
import cv2
import numpy as np
img = np.zeros((500, 500, 3)) # 创建一个500*500的数组,作为我们的背景图
cv2.circle(img, (450, 50), 50, (0, 0, 255), -1) # 画红色实心圆
cv2.rectangle(img, (400, 0), (500, 100), (0, 255, 0), 2) # 画绿色矩形
pos = [(10, 2), (21, 28), (65, 16)]
pos = np.array(pos, np.int32).reshape((-1, 1, 2))
cv2.polylines(img, [pos], True, (255, 255, 255)) # 画左上角的多边形
cv2.line(img, (0, 0), (500, 500), (255, 0, 0), 2) # 画对角蓝线
cv2.ellipse(img, (250, 250), (80, 30), 0, 0, 180, (255, 0, 0), -1) # 画半椭圆
cv2.putText(img, "Opencv-Python", (50, 450), cv2.FONT_HERSHEY_SCRIPT_SIMPLEX, 2, (255, 255, 255), 3) # 添加文字,样式为手写体
cv2.imshow("", img)
cv2.waitKey(0)