OpenCV攻略:(二) 几何图形绘制

193 阅读4分钟

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()

代码解析

  1. 创建空白图像:

    # 创建一个空白的图像,宽度和高度都是 500 像素,颜色通道数为 3(RGB)
    image = np.zeros((500, 500, 3), dtype=np.uint8)
    
    • 使用 np.zeros() 创建一个 500x500 像素大小的黑色图像。
  2. 绘制直线:

    # 绘制直线
    cv2.line(image, (0, 0), (500, 500), (255, 0, 0), 5)
    
    • cv2.line() 函数用于绘制一条从左上角到右下角的蓝色直线。
    • (0, 0) 和 (500, 500) 是直线的两个端点。
    • (255, 0, 0) 表示蓝色。
    • 5 表示线条的粗细。
  3. 绘制矩形:

    # 绘制矩形
    cv2.rectangle(image, (150, 25), (350, 125), (0, 255, 0), 3)
    
    • cv2.rectangle() 函数用于绘制一个绿色矩形。
    • (150, 25) 和 (350, 125) 分别表示矩形的左上角和右下角坐标。
    • (0, 255, 0) 表示绿色。
    • 3 表示线条的粗细。
  4. 绘制圆形:

    # 绘制圆形
    cv2.circle(image, (400, 400), 60, (0, 0, 255), -1)
    
    • cv2.circle() 函数用于绘制一个红色的实心圆。
    • (400, 400) 表示圆心坐标。
    • 60 表示半径。
    • (0, 0, 255) 表示红色。
    • -1 表示填充。
  5. 绘制椭圆:

    # 绘制椭圆
    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 表示线条的粗细。
  6. 绘制多边形:

    # 绘制多边形
    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 表示线条的粗细。
  7. 显示和保存图像:

    # 显示绘制好的图像
    cv2.imshow("Shapes", image)
    cv2.waitKey(0)  # 等待按键事件
    cv2.destroyAllWindows()  # 关闭所有窗口
    
    # 保存图像到文件
    cv2.imwrite("shapes_example.png", image)
    
    • 使用 cv2.imshow() 显示图像。
    • 使用 cv2.imwrite() 将图像保存到文件中。