OpenCV攻略:(二) 几何图形绘制
使用OpenCV的API可以实现在图片上绘制多种图形。
包括直线,矩形,圆形,椭圆,多边形,文本。
完整实例代码如下
import cv2
import numpy as np
# 创建一个黑色的图像
# 参数分别是宽度、高度和颜色(BGR)通道数(对于RGB图像是3)
image = np.zeros((512, 512, 3), np.uint8)
# 颜色(BGR)顺序BGR
# 绘制一条线
# cv2.line(图像, 起始点, 结束点, 颜色(BGR), 线宽)
cv2.line(image, (20, 20), (500, 100), (0, 255, 0), 2) # 绿色线,线宽为2
# 绘制一个矩形
# cv2.rectangle(图像, 起始点, 结束点, 颜色(BGR), 线宽)
cv2.rectangle(image, (20, 200), (220, 400), (255, 0, 0), 2) # 蓝色空心矩形,线宽为2
# 如果线宽为 -1,则填充整个矩形
cv2.rectangle(image, (240, 200), (500, 400), (255, 0, 0), -1) # 蓝色实心矩形,线宽为-1
# 绘制一个圆
# cv2.circle(图像, 圆心, 半径, 颜色(BGR), 线宽)
cv2.circle(image, (100, 100), 64, (0, 0, 255), 2) # 红色空心圆
# 如果线宽为 -1,则填充整个圆形
cv2.circle(image, (320, 100), 64, (0, 0, 255), -1) # 红色是新心圆
# 绘制椭圆
# cv2.ellipse(图像,椭圆中心,椭圆轴长,旋转角度,起始角度,结束角度,颜色(BGR),线条粗细)
cv2.ellipse(image, (350, 350), (100, 50), 45, 0, 360, (255, 255, 255), 3) # 白色空心椭圆
# 如果线宽为 -1,则填充整个椭圆
cv2.ellipse(image, (150, 150), (100, 50), 0, 0, 360, (255, 255, 255), -1) # 白色实心椭圆
# 绘制一个多边形
# 首先定义顶点坐标列表
pts1 = np.array([
[100, 100],
[200, 150],
[250, 200],
[200, 300],
[150, 350],
[100, 300],
[50, 350],
[50, 300],
[100, 200]
], np.int32)
pts2 = np.array([
[300, 100],
[400, 150],
[450, 200],
[400, 300],
[350, 350],
[300, 300],
[250, 350],
[250, 300],
[300, 200]
], np.int32)
# 定义为闭合多边形
pts1 = pts1.reshape((-1, 1, 2))
pts2 = pts2.reshape((-1, 1, 2))
# 绘制空心多边形
cv2.polylines(image, [pts1], True, (0, 255, 255),3) # 黄色多边形,线宽为3
# 绘制实心多边形
cv2.fillPoly(image, [pts2], (0, 255, 255)) # 黄色实心多边形,线宽为3
# 添加文字
# cv2.putText(图像, 文本, 起始位置, 字体, 字体大小, 颜色(BGR), 线宽, 线条类型)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(image, 'Hello OpenCV!,It is very funny', (10, 450), font, 1, (255, 255, 255), 2, cv2.LINE_AA)
# 显示图像
cv2.imshow('Draw Demo', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
代码解析
-
创建空白图像:
# 创建一个空白的图像,宽度和高度都是 500 像素,颜色通道数为 3(RGB) image = np.zeros((500, 500, 3), dtype=np.uint8)- 使用
np.zeros()创建一个 500x500 像素大小的黑色图像。
- 使用
-
绘制直线:
# 绘制直线 cv2.line(image, (0, 0), (500, 500), (255, 0, 0), 5)cv2.line()函数用于绘制一条从左上角到右下角的蓝色直线。(0, 0)和(500, 500)是直线的两个端点。(255, 0, 0)表示蓝色。5表示线条的粗细。
-
绘制矩形:
# 绘制矩形 cv2.rectangle(image, (150, 25), (350, 125), (0, 255, 0), 3)cv2.rectangle()函数用于绘制一个绿色矩形。(150, 25)和(350, 125)分别表示矩形的左上角和右下角坐标。(0, 255, 0)表示绿色。3表示线条的粗细。
-
绘制圆形:
# 绘制圆形 cv2.circle(image, (400, 400), 60, (0, 0, 255), -1)cv2.circle()函数用于绘制一个红色的实心圆。(400, 400)表示圆心坐标。60表示半径。(0, 0, 255)表示红色。-1表示填充。
-
绘制椭圆:
# 绘制椭圆 cv2.ellipse(image, (250, 250), (100, 50), 45, 0, 180, (0, 255, 255), 3)cv2.ellipse()函数用于绘制一个旋转 45 度的椭圆。(250, 250)表示椭圆的中心。(100, 50)表示椭圆的主轴长度。45表示旋转角度。0和180表示起始和结束角度。(0, 255, 255)表示黄色。3表示线条的粗细。
-
绘制多边形:
# 绘制多边形 polygon_points = np.array([[100, 200], [200, 300], [300, 200]], np.int32) polygon_points = polygon_points.reshape((-1, 1, 2)) cv2.polylines(image, [polygon_points], True, (255, 255, 0), 3)- 首先定义一个多边形的顶点坐标。
- 使用
cv2.polylines()函数绘制多边形。 True表示多边形是闭合的。(255, 255, 0)表示黄色。3表示线条的粗细。
-
显示和保存图像:
# 显示绘制好的图像 cv2.imshow("Shapes", image) cv2.waitKey(0) # 等待按键事件 cv2.destroyAllWindows() # 关闭所有窗口 # 保存图像到文件 cv2.imwrite("shapes_example.png", image)- 使用
cv2.imshow()显示图像。 - 使用
cv2.imwrite()将图像保存到文件中。
- 使用