智能硬件与机器视觉:基于树莓派、Python和OpenCV
上QQ阅读APP看书,第一时间看更新

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代码练习使用不同颜色,字体,大小或位置在图像上添加文本。