📜  使用 OpenCV-Python 进行行人检测(1)

📅  最后修改于: 2023-12-03 15:36:32.718000             🧑  作者: Mango

使用 OpenCV-Python 进行行人检测

简介

OpenCV-Python 是 OpenCV 的 Python 版本,在机器视觉领域非常常用。OpenCV-Python 包含了各种图像处理、计算机视觉、机器学习等模块,其中对动态物体的检测算法尤其突出。本文将介绍如何使用 OpenCV-Python 进行行人检测。

准备工作

要使用 OpenCV-Python 进行行人检测,首先需要安装 OpenCV-Python 包。可以使用 pip 进行安装,命令如下:

pip install opencv-python

另外,为了方便处理图片和视频,还需要安装 numpy 包。同样可以使用 pip 进行安装,命令如下:

pip install numpy
行人检测流程

行人检测的流程分为以下几步:

  1. 使用分类器加载 Haar 特征。
  2. 加载要检测的图片或视频。
  3. 处理图像,使其适合分类器的要求。
  4. 使用分类器对图像进行分类,得到行人的位置信息。
  5. 将行人的位置信息标记在原图像上并显示。

以下将详细介绍这一流程。

加载 Haar 特征

OpenCV-Python 中提供了一些经过训练的分类器,能够对人脸、眼睛和行人等动态物体进行检测。这些分类器可以通过 XML 文件进行加载。在本例中,我们要使用的是行人分类器,其 XML 文件可在 OpenCV 源码中的 data/haarcascades 目录下找到。

import cv2

# 加载 Haar 特征
person_cascade = cv2.CascadeClassifier('data/haarcascades/haarcascade_fullbody.xml')
加载图像

接下来需要加载要检测的图像。OpenCV-Python 中提供了 cv2.imread() 函数,可以快速读取图像文件。并且,OpenCV-Python 中使用 NumPy 数组来存储图像数据,这使得对图像进行处理变得非常方便。

import cv2

# 加载 Haar 特征
person_cascade = cv2.CascadeClassifier('data/haarcascades/haarcascade_fullbody.xml')

# 加载图像
img = cv2.imread('test.jpg')
图像处理

在检测行人之前,需要先对加载的图像进行一些处理。一般来说,需要将其转换为灰度图像,因为在灰度图像上的处理效果要好于彩色图像。此外,还可以进行一些直方图均衡、高斯模糊等处理,以提高检测效果。

import cv2

# 加载 Haar 特征
person_cascade = cv2.CascadeClassifier('data/haarcascades/haarcascade_fullbody.xml')

# 加载图像
img = cv2.imread('test.jpg')

# 将图像转为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
行人检测

在处理好图像后,就可以使用分类器对其进行分类了。OpenCV-Python 中提供了 cv2.CascadeClassifier.detectMultiScale() 函数,即多尺度检测函数,可对图像中的所有行人进行检测。其使用方法如下:

persons = person_cascade.detectMultiScale(
    gray,
    scaleFactor=1.1,
    minNeighbors=5,
    minSize=(30, 30),
    maxSize=(100, 100)
)

其中各参数的含义如下:

  • scaleFactor:图像缩放比例。
  • minNeighbors:一个目标周围最小的检测次数。
  • minSize:要检测的最小目标尺寸。
  • maxSize:要检测的最大目标尺寸。
标记行人位置

最后一步是将检测到的行人位置标记在图像上并显示。这可以使用 OpenCV-Python 中的 cv2.rectangle() 函数实现。其使用方法如下:

for (x, y, w, h) in persons:
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]

# 显示图像
cv2.imshow('img', img)
cv2.waitKey()
完整代码
import cv2

# 加载 Haar 特征
person_cascade = cv2.CascadeClassifier('data/haarcascades/haarcascade_fullbody.xml')

# 加载图像
img = cv2.imread('test.jpg')

# 将图像转为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 行人检测
persons = person_cascade.detectMultiScale(
    gray,
    scaleFactor=1.1,
    minNeighbors=5,
    minSize=(30, 30),
    maxSize=(100, 100)
)

# 标记行人位置
for (x, y, w, h) in persons:
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]

# 显示图像
cv2.imshow('img', img)
cv2.waitKey()
结论

本文介绍了如何使用 OpenCV-Python 进行行人检测。通过加载分类器、加载图像、处理图像、行人检测、标记行人位置等步骤,成功地实现了对行人的检测和标记。这些技术在计算机视觉和安防等领域有广泛应用。