Python OpenCV对象检测
OpenCV是用于图像处理,机器学习和计算机视觉的庞大开源库。它也在实时操作中发挥着重要作用。借助OpenCV库,我们可以轻松处理图像和视频,识别文件中的对象,人脸甚至手写信息。本教程将仅关注使用OpenCV进行图像对象检测。我们将学习如何使用Python程序从给定的图像中使用OpenCV进行对象检测。
对象检测
基本上,对象检测是一种与图像处理,深度学习和计算机视觉相关的现代计算机技术,用于检测图像文件中存在的对象。对象检测技术中使用的所有技术(如前述)都与检测图像或视频中的对象实例有关。
使用OpenCV进行对象检测
我们已经在前一节中学习了对象检测,并在本节中学习如何使用OpenCV库在图像或视频中进行对象检测。我们将首先在Python程序中导入OpenCV库,然后使用函数对给定的图像文件执行对象检测。但是,在使用和导入库函数之前,让我们先安装使用对象检测技术的要求。
在本教程中,我们将使用Haar级联技术进行对象检测。让我们首先简要了解一下Haar级联技术。
Haar级联:
基本上,Haar级联技术是一种基于机器学习的方法,我们使用大量正负图像来训练分类器以对图像进行分类。Haar级联分类器被认为是使用OpenCV库进行对象检测的有效方法。现在,让我们理解我们之前讨论过的正面和负面图像的概念:
- 正面图像: 包含我们希望从分类器中识别的对象的图像。
- 负面图像: 不包含我们希望由分类器检测到的任何对象的图像,可以是其他所有物体的图像。
Python OpenCV对象检测的要求
首先,我们必须在系统中安装一些重要的库,因为这是执行对象检测任务的重要要求。为了执行对象检测,我们必须在我们的系统中安装以下库作为执行对象检测的要求:
1. 安装OpenCV库
首先,使用OpenCV库进行对象检测的要求是,我们的设备上必须有OpenCV库,以便我们可以将其导入Python程序并使用其对象检测函数。如果我们的系统中没有此库,我们可以在命令提示符终端中使用以下命令进行安装:
pip install opencv-python
当我们在终端中输入该命令后按下回车键,命令提示符中的pip安装程序将开始将OpenCV库安装到我们的系统中。
正如我们所看到的,OpenCV库已经成功安装到我们的系统中,现在我们可以将其导入到Python程序中以使用其功能。
2. 安装matplotlib库
Matplotlib在Python程序中打开、关闭、读取等图片方面非常有帮助,这就是为什么安装这个库对于目标检测变得非常重要的原因。如果我们的系统中没有matplotlib库,我们需要使用以下命令来在命令提示符窗口中安装它:
pip install matplotlib
当我们在终端中输入此命令后按下回车键,命令提示符中的pip安装程序将开始将其安装到我们的系统中。
如我们所见,matplotlib库已经成功安装在我们的系统中,现在我们可以将其导入Python程序中,以使用其打开、读取等图片的功能。
我们已经安装了执行对象检测所需的所有库,现在我们可以继续进行此任务的实现部分。
在Python中实现对象检测
在这部分中,我们将编写Python程序来进行对象检测,并了解其实现。我们将在我们的Python程序中使用以下图片来进行对象检测:
打开图像
我们首先会打开上面给出的图像,并创建图片的环境以便在输出中显示它。让我们首先看一个示例程序来了解实现,然后我们会看解释部分。
示例1: 使用OpenCV和matplotlib库在Python程序中打开图像:
# Import OpenCV module
import cv2
# Import pyplot from matplotlib as pltd
from matplotlib import pyplot as pltd
# Opening the image from files
imaging = cv2.imread("opencv-od.png")
# Altering properties of image with cv2
img_gray = cv2.cvtColor(imaging, cv2.COLOR_BGR2GRAY)
imaging_rgb = cv2.cvtColor(imaging, cv2.COLOR_BGR2RGB)
# Plotting image with subplot() from plt
pltd.subplot(1, 1, 1)
# Displaying image in the output
pltd.imshow(imaging_rgb)
pltd.show()
输出:
说明:
首先,我们将OpenCV(作为cv2)和matplotlib(作为plt)库导入程序,以便在代码中使用它们的函数。然后,我们使用cv2的imread()函数打开图像文件。
然后,我们使用cv2函数定义了程序中打开的图像的属性。然后,我们使用plt的subplot()函数对图像进行子图划分,并在其中给出参数。最后,我们使用plt模块的imshow()和show()函数来显示图像输出。
从输出中可以看到,图像作为程序结果显示出来,并且其边框已经被子图化。
图像中的识别或对象检测
现在,我们将使用detectMultiScale()函数在程序中检测图像中的对象。以下是在代码中使用detectMultiScale()函数的语法:
found = xml_data.detectMultiScale(img_gray,
minSize = (30, 30))
我们将在程序中使用条件语句来检查是否检测到图像中的任何对象,并突出显示检测到的部分。让我们通过一个示例程序了解图像中对象检测的实现。
示例2: 使用detectMultiScale()在以下Python程序中进行图像中的对象检测:
# Import OpenCV module
import cv2
# Import pyplot from matplotlib as plt
from matplotlib import pyplot as pltd
# Opening the image from files
imaging = cv2.imread("opencv-od.png")
# Altering properties of image with cv2
imaging_gray = cv2.cvtColor(imaging, cv2.COLOR_BGR2GRAY)
imaging_rgb = cv2.cvtColor(imaging, cv2.COLOR_BGR2RGB)
# Importing Haar cascade classifier xml data
xml_data = cv2.CascadeClassifier('XML-data.xml')
# Detecting object in the image with Haar cascade classifier
detecting = xml_data.detectMultiScale(imaging_gray,
minSize = (30, 30))
# Amount of object detected
amountDetecting = len(detecting)
# Using if condition to highlight the object detected
if amountDetecting != 0:
for (a, b, width, height) in detecting:
cv2.rectangle(imaging_rgb, (a, b), # Highlighting detected object with rectangle
(a + height, b + width),
(0, 275, 0), 9)
# Plotting image with subplot() from plt
pltd.subplot(1, 1, 1)
# Displaying image in the output
pltd.imshow(imaging_rgb)
pltd.show()
输出:
解释:
在打开图像后,我们将级联分类器的XML文件导入程序。然后,我们使用 detectMultiScale() 函数与导入的级联文件一起检测图像中是否存在对象。
我们在程序中使用if条件来检查是否检测到对象,如果检测到对象,我们使用for循环和cv2函数突出显示检测到的对象部分。在突出显示图像中的检测到的对象部分后,我们使用plt的函数显示处理后的图像 show() 和 imshow() 函数。
如我们在输出中所见,当我们运行程序时,将显示突出显示了对象检测部分的图像。