Python教程-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条件来检查是否检测到对象,如果检测到对象,我们使用cv2函数和for循环来突出显示检测到的对象部分。在突出显示了图像中检测到的对象部分后,我们使用plt的show()和imshow()函数来显示处理后的图像。
正如我们在输出中看到的,运行程序时,我们会看到带有突出显示的检测到的对象部分的图像。