4.2.7 在图像上绘图
在本节中,我们将在图像上绘制矩形、圆形和直线,还会在图像上附加文本。
在使用OpenCV绘制图像之前,必须注意图像上的绘制操作是替换原图的。因此,在每个代码块的开头,需要制作原始图像的副本并存为output。然后在output图像上绘制,这样就不会破坏原始图像。
先来画一个矩形,具体实现代码如下:
# 在脸部周围画一个2像素的红色矩形 #74 output = image.copy() #75 cv2.rectangle(output, (300,150), (400,260), (0, 0, 255), 2) #76 cv2.imshow("Rectangle", output) #77 cv2.waitKey(0) #78
首先,在第75行复制图像,然后,继续绘制矩形。
在OpenCV中绘制矩形稍微有点复杂。要预先计算坐标,这里已经给第76行的cv2.rectangle函数提供了以下参数。
·img:要绘制的目标图像。我们是在output图像上进行绘制的。
·pt1:起始像素坐标,即左上角。本例中,左上角位置是(180,40)。
·pt2:结束像素坐标即右下角。右下角位置是(260,135)。
·color:BGR元组。(0,0,255)表示红色。
·thickness:线条粗细(负值就是实心矩形)。本例设置厚度为2。
由于使用的是OpenCV的函数操作,而不是NumPy。所以可以以(x,y)顺序而不是(y,x)提供坐标,因为没有直接操作或访问NumPy数组(OpenCV会自动处理这个问题)。结果如图4-10所示。
图4-10 绘制矩形
使用OpenCV和Python绘制形状非常容易掌握。在图4-10中,我用cv2.rectangle画了一个红色的框。此示例预先确定了脸部周围的坐标,你也可以使用脸部检测方法自动获取脸部坐标。
现在,画一个实心蓝色圆圈:
# 在以x = 170,y = 110为中心的图像上 #80 # 绘制一个蓝色的20像素(相当于填充)圆圈 #81 output = image.copy() #82 cv2.circle(output, (170, 110), 20, (255, 0, 0), -1) #83 cv2.imshow("Circle", output) #84 cv2.waitKey(0) #85
要绘制圆,你需要为cv2.circle提供以下参数。
·img:输出图像。
·center:圆心坐标。本例设置为(170,110)。
·radius:圆的半径,以像素为单位。本例设置为20像素。
·color:圆形颜色。这次我选择了蓝色,在BGR元组中B的值是255,G和R都是0,即(255,0,0)。
·thickness:线条粗细。由于设置了负值(–1),因此圆圈是实心的。
结果如图4-11所示。
图4-11 绘制圆形
OpenCV的cv2.circle函数允许你在图像上的任何位置画圆圈。本例绘制了一个实心圆,用-1的thickness参数表示(正值会形成线粗可变的圆形轮廓)。
接下来,绘制一条红线,如果仔细查看函数的参数并将它们与矩形的参数进行比较,你会发现其实它们是一样的:
# 从x = 325,y = 296到x = 618,y = 180绘制5像素的红线 #87 output = image.copy() #88 cv2.line(output, (325, 296), (618, 180), (0, 0, 255), 5) #89 cv2.imshow("Line", output) #90 cv2.waitKey(0) #91
与画矩形一样,需要提供两个点(起点、终点),颜色和线条粗细参数。OpenCV的后端会完成其余的操作。图4-12显示了代码中第89行的结果。
图4-12 绘制直线
通常,你需要在图像上叠加文本并显示。如果你正在进行人脸识别,你可能想要在他们的脸上画出这个人的名字。或者,如果你在研究计算机视觉项目,你可以构建图像分类器或目标检测器。在这些情况下,你都需要在图像上添加包含类名和概率大小的文本。
OpenCV的putText函数的实现过程如下:
# 在图像上添加绿色文本 #93 output = image.copy() #94 cv2.putText(output, "OpenCV + You can learn OpenCV", (10, 25), #95 cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2) #96 cv2.imshow("Text", output) #97 cv2.waitKey(0) #98
OpenCV的putText函数负责在图像上添加文本。所需的参数包括如下几个。
·img:输出图像。
·text:要在图像上添加的文本字符串。
·pt:文本的起点。
·font:我经常使用cv2.FONT_HERSHEY_SIMPLEX。关于更多可用字体,可参见网址(https://docs.opencv.org/3.4.1/d0/de1/group__core.html#ga0f9314ea6e35f99bb23f29567fc16e11)了解更多内容。
·scale:字体大小。
·color:文字颜色。
·thickness:线条粗细(以像素为单位)。
第95行和第96行的代码将在output图像上添加绿色文本“OpenCV+You can learn OpenCV”,如图4-13所示。
图4-13 添加文本
通常情况下,你可以使用上面的cv2.putText代码练习使用不同颜色,字体,大小或位置在图像上添加文本。