深度学习与计算机视觉:项目式教材
上QQ阅读APP看书,第一时间看更新

1.4 任务3:几何图形绘制

1.4.1 任务描述

基于龙芯平台,利用OpenCV的相关函数实现常用的几何图形绘制。

1.4.2 技术准备

在图像处理中,我们经常需要将某个感兴趣的区域用图形标注出来,以便在开发时观察和调试,尤其是在进行物体检测与物体跟踪时,绘图是必不可少的操作。OpenCV提供了一系列的几何图形绘制函数,可以实现在图像中绘制线段、矩形、圆形、椭圆形、多边形、文本等功能。

1.line()函数

line()函数用于绘制线段,其基本格式如下。

cv2.line(img, start_point, end_point, color, thickness=0)

参数如下。

img:指定需要绘制的图像。

start_point:指定线段的起始坐标,必须是元组类型。

end_point:指定线段的结束坐标,必须是元组类型。

color:指定线条的颜色,必须是元组类型,通常使用BGR颜色值表示颜色,如(255, 0, 0)表示红色。

thickness:指定线条的宽度,默认值为1,若设置为−1,表示绘制填充图形。

2.rectangle()函数

rectangle()函数用于绘制矩形,其基本格式如下。

cv2.rectangle(img, point1, point2, color, thickness=0)

参数如下。

img:指定需要绘制的图像。

point1:指定矩形左上角顶点的坐标,必须是元组类型。

point2:指定矩形右下角顶点的坐标,必须是元组类型。

color:指定线条的颜色,必须是元组类型。

thickness:指定线条的宽度。

注意,该函数每调用一次,就会产生一个矩形,多次调用就会产生多个矩形。

3.circle()函数

circle()函数用于绘制圆形,其基本格式如下。

cv2.circle(img, center, R, color, thickness=0)

参数如下。

img:指定需要绘制的图像。

center:指定圆心坐标,必须是元组类型。

R:指定圆形的半径。

color:指定线条的颜色,必须是元组类型。

thickness:指定线条的宽度。

4.ellipse()函数

ellipse()函数用于绘制椭圆形,其基本格式如下。

cv2.ellipse(img, center, (a, b), direction, angle_start, angle_end, color, thickness)

参数如下。

img:指定需要绘制的图像。

center:指定椭圆形的中心坐标。

(a,b):指定椭圆形的长轴和短轴。

direction:指定顺时针方向的旋转角度。

angle_start:指定绘制椭圆形开始的角度。

angle_end:指定绘制椭圆形结束的角度。

color:指定线条的颜色。

thickness:指定线条的宽度。

5.polylines()函数

polylines()函数用于绘制多边形,其基本格式如下。

cv2.polylines(img, pts, isClosed, color, thickness=0)

参数如下。

img:指定需要绘制的图像。

pts:指定点的坐标集合,一般以列表的形式填入。

isClosed:指定多边形是否闭合。若它为False,表示不闭合;若为True,表示闭合。

color:指定线条的颜色。

thickness:指定线条的宽度。

6.putText()函数

putText()函数用于绘制文本,其基本格式如下。

cv2.putText(img, text, org, fontFace, fontScale, color, thickness, lineType)

参数如下。

img:指定需要添加文字的背景图。

text:指定需要添加的文字。

org:指定添加文字的位置。

fontFace:指定字体。

fontScale:指定字号大小。

color:指定文字的颜色。

thickness:指定线条的宽度。

lineType:指定线条的种类。

1.4.3 任务实施

利用OpenCV的相关函数进行几何图形绘制的代码如下。

import cv2
import numpy as np
# 创建一张图片
img = np.ones((500, 500, 3), np.uint8)
# 绘制线段
cv2.line(img, (60, 240), (220, 240), BGR(0, 0, 255):红色, 3, cv2.LINE_AA)
cv2.line(img, (140, 160), (140, 320), BGR(0, 0, 255):红色, 3, cv2.LINE_AA)
# 绘制矩形
cv2.rectangle(img, (100, 200), (180, 280), (0, 255, 255), 3, cv2.LINE_AA)
cv2.rectangle(img, (80, 180), (200, 300), (0, 255, 255), 3, cv2.LINE_AA)
cv2.rectangle(img, (60, 160), (220, 320), (0, 255, 255), 3, cv2.LINE_AA)
# 绘制圆形
cv2.circle(img, (140, 240), 80, (255, 255, 0), 2, cv2.LINE_AA)
cv2.circle(img, (140, 240), 60, (255, 255, 0), 2, cv2.LINE_AA)
cv2.circle(img, (140, 240), 40, (255, 255, 0), 2, cv2.LINE_AA)
# 绘制椭圆形
cv2.ellipse(img, (140, 80), (100, 50), 0, 0, 360, (0, 255, 0), 2, cv2.LINE_AA)
cv2.ellipse(img, (140, 80), (90, 40), 0, 0, 90, (255, 0, 0), 2, cv2.LINE_AA)
cv2.ellipse(img, (140, 80), (90, 40), 0, 270, 360, (0, 255, 0), 2, cv2.LINE_AA)
cv2.ellipse(img, (140, 80), (80, 30), 0, 0, 90, (0, 255, 0), 2, cv2.LINE_AA)
cv2.ellipse(img, (140, 80), (80, 30), 0, 270, 360, (255, 255, 0), 2, cv2.LINE_AA)
cv2.ellipse(img, (140, 80), (70, 20), 0, 90, 270, (255, 255, 0), 2, cv2.LINE_AA)
# 绘制多边形
pts = np.array([[400, 100], [300, 140], [450, 250], [350, 250]], np.int32)
cv2.polylines(img, [pts], True, (0, 0, 255), 1, cv2.LINE_AA)
# 绘制文字
cv2.putText(img, 'loongson Platform: OpenCV', (0, 450), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,0),4)
cv2.imshow("Image ", img)
cv2.waitKey(0)

几何图形绘制结果如图1-5所示。

▲图1-5 几何图形绘制结果