使用 OpenCV-Python 进行行人检测
OpenCV 是一个针对实时计算机视觉的开源库。该库由英特尔开发,是跨平台的——它可以支持Python、C++、 Java等。计算机视觉是计算机科学的前沿领域,旨在使计算机能够理解图像中所看到的内容。 OpenCV 是用于计算机视觉任务(如人脸识别、运动检测、对象检测等)的最广泛使用的库之一。
在本教程中,我们将使用 OpenCV 为图像和视频构建一个基本的行人检测器。行人检测是一个非常重要的研究领域,因为它可以增强自动驾驶汽车中行人保护系统的功能。
我们可以从人体图像中提取头部、两条手臂、两条腿等特征,并将它们传递给机器学习模型。训练后,该模型可用于检测和跟踪图像和视频流中的人。然而,OpenCV 有一个内置的方法来检测行人。它有一个预训练的HOG(定向梯度直方图)+ 线性 SVM 模型来检测图像和视频流中的行人。
定向梯度直方图
该算法直接检查每个像素的周围像素。目标是检查当前像素与周围像素相比有多暗。该算法绘制和箭头显示图像变暗的方向。它对图像中的每个像素重复该过程。最后,每个像素都会被一个箭头代替,这些箭头被称为Gradients 。这些渐变显示了光从亮到暗的流动。通过使用这些梯度算法执行进一步的分析。要了解有关 HOG 的更多信息,请阅读 Navneet Dalal 和 Bill Triggs 关于 HOG 用于人体检测的研究论文。
要求
opencv-python 3.4.2
imutils 0.5.3
要安装上述模块,请在终端中键入以下命令。
pip install moudle_name
示例 1:
让我们编写程序来检测图像中的行人:
使用的图像:
import cv2
import imutils
# Initializing the HOG person
# detector
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
# Reading the Image
image = cv2.imread('img.png')
# Resizing the Image
image = imutils.resize(image,
width=min(400, image.shape[1]))
# Detecting all the regions in the
# Image that has a pedestrians inside it
(regions, _) = hog.detectMultiScale(image,
winStride=(4, 4),
padding=(4, 4),
scale=1.05)
# Drawing the regions in the Image
for (x, y, w, h) in regions:
cv2.rectangle(image, (x, y),
(x + w, y + h),
(0, 0, 255), 2)
# Showing the output Image
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出:
示例 2:让我们编写程序来检测视频中的行人:
import cv2
import imutils
# Initializing the HOG person
# detector
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
cap = cv2.VideoCapture('vid.mp4')
while cap.isOpened():
# Reading the video stream
ret, image = cap.read()
if ret:
image = imutils.resize(image,
width=min(400, image.shape[1]))
# Detecting all the regions
# in the Image that has a
# pedestrians inside it
(regions, _) = hog.detectMultiScale(image,
winStride=(4, 4),
padding=(4, 4),
scale=1.05)
# Drawing the regions in the
# Image
for (x, y, w, h) in regions:
cv2.rectangle(image, (x, y),
(x + w, y + h),
(0, 0, 255), 2)
# Showing the output Image
cv2.imshow("Image", image)
if cv2.waitKey(25) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()
输出: