opencv 绘图
参数说明
绘制形状的函数有一些共同的参数:
- img:要绘制形状的图片
- color:绘制的颜色
- 彩色图就传入 BGR 的一组值,如蓝色就是 (255,0,0)
- 灰度图,传入一个灰度值就行
- thickness:线宽,默认为 1;对于矩形 / 圆之类的封闭形状而言,传入 - 1 表示填充形状
- lineType:线条类型,三个参数可选 cv2.LINE_4、cv2.LINE_8、cv2.LINE_AA
1. 画线
cv2.line(img, ps, pe, color, thickness, lineType, shift)
ps:直线的起点位置,注意这是一个坐标点,类似 (X,Y) 这样,
pe:直线的终点位置,同上
绘制多条直线
如果需要绘制多条直线,使用 cv2.polylines() 要比 cv2.line() 高效很多,
例如:
# 使用cv2.polylines()画多条直线
line1 = np.array([[100, 20], [300, 20]], np.int32).reshape((-1, 1, 2))
line2 = np.array([[100, 60], [300, 60]], np.int32).reshape((-1, 1, 2))
line3 = np.array([[100, 100], [300, 100]], np.int32).reshape((-1, 1, 2))
cv2.polylines(img, [line1, line2, line3], True, (0, 255, 255))
2. 矩形
cv2.rectangle(img, ps, pe, color, thickness, lineType, shift)
ps:矩形左上角点的坐标,
pe:矩形右下角点的坐标,
shift:坐标点小数点位数
3. 圆
cv2.circle(img, center, radius, color, thickness, lineType, shift)
center:圆心坐标,
radius:圆的半径值,
shift:圆心坐标和半径的小数点位数
5. 多边形
cv2.polylines(img, pts, isClosed, color, thickness, lineType, shift)
pts:多边形各边的坐标点组成的一个列表,是一个 numpy 的数组类型
isClosed:值为 True 或 False,若为 True 则表示一个闭合的多边形,若为 False 则不闭合
要绘制多边形,首先需要顶点的坐标。将这些点组成形状为ROWSx1x2
的数组,其中ROWS
是顶点数,并且其类型应为 int32。在这里,我们绘制了一个带有四个顶点的黄色小多边形。
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv.polylines(img,[pts],True,(0,255,255))
6. 向文本或矩形框添加文字
cv2.putText(img, text, org, fontFace, fontScale, color, thickness, lineType, bottomLeftOrigin)
-
text:文字内容,
-
org:文字在图像中的左下角坐标
-
fontFace:字体类型,可选参数有以下几种
FONT_HERSHEY_SIMPLEX,FONT_HERSHEY_PLAIN,FONT_HERSHEY_DUPLEX,FONT_HERSHEY_COMPLEX, FONT_HERSHEY_TRIPLEX, FONT_HERSHEY_COMPLEX_SMALL, FONT_HERSHEY_SCRIPT_SIMPLEX, orFONT_HERSHEY_SCRIPT_COMPLEX
- fontScale:缩放比例,用该值乘以程序字体默认大小即为字体大小
- bottomLeftOrigin:默认为 true,即表示图像数据原点在左下角;若为 False 则表示图像数据原点在左上角。
import cv2 as cv
import numpy as np
img=np.zeros([512,512,3],np.uint8) ##创建一副黑色的图片
"""画线"""
cv.line(img,(0,32),(512,89),(255,0,0),3,cv.LINE_8)
"""画矩阵"""
tangle=cv.rectangle(img, (84, 45), (210, 228), (0, 255, 0), 3,cv.LINE_4)
"""画圆"""
cv.circle(img, (447, 63), 63, (0, 0, 255), -1)
"""画椭圆"""
cv.ellipse(img, (256, 256), (100, 50), 90, 0, 360, (255, 0, 0), 2)
"""画多边形"""
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv.polylines(img,[pts],True,(0,255,255))
"""在图片上加文字"""
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,'OpenCV',(10,500), font, 2,( 0,255,0),2,cv.LINE_AA)
"""矩形框上加文字"""
cv.putText(tangle,'OpenCV',(84, 40), font, 0.5,( 0,255,0),1,cv.LINE_AA)
"""使用cv.polylines()画多条直线"""
line1 = np.array([[100, 20], [300, 20]], np.int32).reshape((-1, 1, 2))
line2 = np.array([[100, 60], [300, 60]], np.int32).reshape((-1, 1, 2))
line3 = np.array([[100, 100], [300, 100]], np.int32).reshape((-1, 1, 2))
cv.polylines(img, [line1, line2, line3], True, (0, 255, 255))
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()