前置内容
这篇内容不是本书内容,但后续用的到,特做记录。
使用OpenCV中不可避免需要用到各种绘图功能,比如绘制人脸库、显示人脸识别信息,那就需要用到OpenCV的绘图函数,这些函数包括cv2.line(),
cv2.circle(),cv2.rectangle(),cv2.ellipse(),cv2.putText()等等。
上面函数需要用到的参数说明:
- img : 绘制图像的画布(图像)
- color : 形状的颜色,RGB标识为(B,G,R)的元祖,灰度图只传入灰度值即可
- thickness : 线条的粗细,封闭图像设置为-1,负责显示图形线条粗细
- linetype : 线条类型,有8连接/抗锯齿等,默认为8连接。cv2.LINE_AA为抗锯齿,图形会变的平滑
- 画直线
只要知道起始2点的坐标即可。
cv2.line(绘制图层,(起点x,起点y),(终点x,终点y),(b,g,r),粗细大小)
- 画圆
确定圆形原点和半径即可确定圆的位置。
cv2.circle(绘制图层,(圆心x,圆心y),半径,(b,g,r),划线粗细)
- 画矩形
之前左上角和右下角就能确定矩形的大小。
cv2.rectangle(绘制图层,(左上角x,左上角y),(右下角x,右下角y),(b,g,r),划线粗细)
- 画椭圆
cv2.ellipse(绘制图层,(椭圆圆心x,椭圆圆心y),(长轴长,短轴长),椭圆整体旋转角度,椭圆绘制开始角度,椭圆绘制停止角度,颜色,划线粗细)
划线粗细为-1时表示实心椭圆,如果长短轴一样就变成圆形,再控制绘制角度可以绘制半圆
- 画不规则图像
通过一系列的点的集合来确定整个图形的大小及样式。
cv2.polylines(绘制图层,点集,是否闭合,(b,g,r),划线粗细)
- 绘制文字
cv.putText(绘制图层,内容,(文字左下角x,文字左下角y),字体样式,字体大小,字体颜色,线条宽度)
举例程序如下:
canvas = np.zeros((600, 600, 3), np.uint8) # 全0的黑色背景
# canvas = np.ones((600, 600, 3), np.uint8) * 255 # 全白背景
# 绘制直线
cv.line(canvas, (0, 0), (200, 90), (255, 0, 0), 5) # cv2.line(绘制图层,(起点x,起点y),(终点x,终点y),(b,g,r),粗细大小)
# 绘制矩阵
cv.rectangle(canvas, (250, 250), (300, 430), (0, 255, 255),
2) # cv2.rectangle(绘制图层,(左上角x,左上角y),(右下角x,右下角y),(b,g,r),划线粗细) 划线粗细为-1时表示实心矩阵
# 绘制圆形
cv.circle(canvas, (400, 400), 50, (0, 0, 255), -1) # cv2.circle(绘制图层,(圆心x,圆心y),半径,(b,g,r),划线粗细) 划线粗细为负数时表示实心圆
#绘制椭圆
cv.ellipse(canvas, (256, 256), (100, 70), 30, 0, 360, 255, -1)#cv2.ellipse(绘制图层,(椭圆圆心x,椭圆圆心y),(长轴长,短轴长),椭圆整体旋转角度,椭圆绘制开始角度,椭圆绘制停止角度,颜色,划线粗细)划线粗细为-1时表示实心椭圆
# 绘制其他边形
pts = np.array([[30, 50], [30, 250], [130, 250], [130, 350], [230, 350]], np.int32)
cv.polylines(canvas, [pts], True, (100, 100, 100), 1) # cv2.polylines(绘制图层,点集,是否闭合,(b,g,r),划线粗细)
# 绘制文字 cv.putText(绘制图层,内容,(文字左下角x,文字左下角y),字体样式,字体大小,字体颜色,线条宽度)
cv.putText(canvas, "HelloOpenCV", (100, 100), cv2.FONT_HERSHEY_TRIPLEX, 2, (66, 66, 66), 3)
cv.imshow("Canvas", canvas)
cv.waitKey()
cv.destroyAllWindows()
运行如下: