OpenCV 提供了方便的绘图功能,使用其中的绘图函数可以绘制直线、矩形、圆、椭圆等多种几何图形,还能在图像中的指定位置添加文字说明。
OpenCV 提供了绘制直线的函数 cv2.line()、绘制矩形的函数 cv2.rectangle()、绘制圆的函数cv2.circle()、绘制椭圆的函数cv2.ellipse()、绘制多边形的函数 cv2.polylines()、在图像内添加文字的函数 cv2.putText()等多种绘图函数。
这些绘图函数有一些共有的参数,主要用于设置源图像、颜色、线条属性等。下面对这些共有参数做简单的介绍。
OpenCV 提供了函数 cv2.line()用来绘制直线(线段)。该函数的语法格式为:
img = cv2.line( img, pt1, pt2, color[, thickness[, lineType ]])
式中:
import numpy as np
import cv2
n = 300 # 图像尺寸
# 创建一个空白的彩色图像,尺寸为(n+1) x (n+1),3通道(RGB)
img = np.zeros((n+1, n+1, 3), np.uint8)
# 在图像上绘制蓝色直线,起点为(0,0),终点为(n,n),线宽为3
img = cv2.line(img, (0, 0), (n, n), (255, 0, 0), 3)
# 在图像上绘制绿色直线,起点为(0,100),终点为(n,100),线宽为1
img = cv2.line(img, (0, 100), (n, 100), (0, 255, 0), 1)
# 在图像上绘制红色直线,起点为(100,0),终点为(100,n),线宽为6
img = cv2.line(img, (100, 0), (100, n), (0, 0, 255), 6)
winname = 'line-demo' # 窗口名称
# 创建一个窗口并设置窗口名字
cv2.namedWindow(winname)
# 在窗口中显示图像
cv2.imshow(winname, img)
# 等待键盘按键,0表示无限等待
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
OpenCV 提供了函数 cv2.rectangle()
用来绘制矩形。该函数的语法格式为:
img = cv2.rectangle( img, pt1, pt2, color[, thickness[, lineType]] )
式中:
代码如下:
import numpy as np
import cv2
n = 300 # 图像尺寸
# 创建一个白色背景的彩色图像,尺寸为n x n,3通道(RGB)
img = np.ones((n, n, 3), np.uint8) * 255
# 在图像上绘制填充的红色矩形,左上角坐标为(50, 50),右下角坐标为(n-100, n-50),颜色为红色,厚度为-1表示填充, 0表示不填充
img = cv2.rectangle(img, (50, 50), (n-100, n-50), (0, 0, 255), -1)
winname = 'rect-shixin' # 窗口名称
# 创建一个窗口并设置窗口名字
cv2.namedWindow(winname)
# 在窗口中显示图像
cv2.imshow(winname, img)
# 等待键盘按键,0表示无限等待
cv2.waitKey(0)
# 关闭所有打开的窗口
cv2.destroyAllWindows()
将img = cv2.rectangle(img, (50, 50), (n-100, n-50), (0, 0, 255), -1)
其中的 -1 改成0,就可以画一个非实心的矩形框,效果如下。
OpenCV 提供了函数 cv2.circle()
用来绘制圆。该函数的语法格式为:
img = cv2.circle( img, center, radius, color[, thickness[, lineType]] )
式中:
参数 img、color、thickness、lineType 的含义如前面的说明所示。
center 为圆心。
radius 为半径
代码如下:
import numpy as np
import cv2
d = 400
img = np.ones((d,d,3),dtype="uint8")*255
(centerX,centerY) = (round(img.shape[1] / 2),round(img.shape[0] / 2))
# 将图像的中心作为圆心,实际值为 d/2
red = (0,0,255) # 设置白色变量
for r in range(5,round(d/2),12):
cv2.circle(img,(centerX,centerY),r,red,3)
# circle(载体图像,圆心,半径,颜色)
cv2.imshow("Demo19.3",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行效果:
OpenCV 提供了函数 cv2.ellipse()用来绘制椭圆。该函数的语法格式为:
img=cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color[,
thickness[, lineType]])
式中:
import numpy as np
import cv2
d = 400
img = np.ones((d,d,3),dtype="uint8")*255
# 生成白色背景
center=(round(d/2),round(d/2))
# 注意数值类型,不可以使用语句 center=(d/2,d/2)
size=(100,200)
# 轴的长度
for i in range(0,10):
angle = np.random.randint(0,361)
# 偏移角度
color = np.random.randint(0,high = 256,size = (3,)).tolist()
# 生成随机颜色,3 个[0,256)的随机数
thickness = np.random.randint(1,9)
cv2.ellipse(img, center, size, angle, 0, 360, color,thickness)
cv2.imshow("demo-tuoyuan",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
OpenCV 提供了函数 cv2.polylines()用来绘制多边形。该函数的语法格式为:
img = cv2.polylines( img, pts, isClosed, color[, thickness[,
lineType[, shift]]])
式中:
在使用函数 cv2.polylines()绘制多边形时,需要给出每个顶点的坐标。这些点的坐标构建了一个大小等于“顶点个数12”的数组,这个数组的数据类型必须为 numpy.int32。
import numpy as np
import cv2
d = 400 # 图像尺寸
# 创建一个白色背景的彩色图像,尺寸为d x d,3通道(RGB)
img = np.ones((d, d, 3), dtype="uint8") * 255
# 生成多边形的各个顶点坐标
pts = np.array([[200, 50], [300, 200], [200, 350], [100, 200]], np.int32)
# 重新整形顶点数组,将其变为顶点数 x 1 x 2 的形状
pts = pts.reshape((-1, 1, 2))
# 使用 cv2.polylines() 函数绘制多边形
# 第一个参数为图像,第二个参数为顶点数组,第三个参数为True表示封闭多边形,颜色为绿色,线宽为8
cv2.polylines(img, [pts], True, (0, 255, 0), 8)
cv2.imshow("duobianxing",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
函数 cv2.polylines()中的第 3 个参数 isClosed 是闭合标记,将该值设置为 False 时,仅仅将
各个顶点用线段连接,多边形是不封闭的。此时的代码为:
cv2.polylines(img,[pts],False,(0,255,0),8)
效果如下:
OpenCV 提供了函数 cv2.putText()用来在图形上绘制文字。该函数的语法格式为:
img=cv2.putText(img, text, org, fontFace, fontScale, color[,
thickness[, lineType[, bottomLeftOrigin]]])
式中:
代码如下:
import numpy as np
import cv2
d = 400 # 图像尺寸
# 创建一个白色背景的彩色图像,尺寸为d x d,3通道(RGB)
img = np.ones((d, d, 3), dtype="uint8") * 255
# 定义字体
font = cv2.FONT_HERSHEY_SIMPLEX
# 在图像上绘制红色的 "OpenCV" 文本,位置同样为(0, 200),字体大小为3,线宽为5
cv2.putText(img, 'OpenCV', (0, 200), font, 3, (0, 0, 255), 5)
# 创建一个窗口并显示图像
cv2.imshow("weizi", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
该段程序在图像 img 中使用函数 cv2.putText()绘制了文字
“OpenCV”。