Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之四 简单行人人体检测效果
目录
[Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之四 简单行人人体检测效果](#Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之四 简单行人人体检测效果)
一、简单介绍
Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。
这里使用 Python 基于 OpenCV 进行视觉图像处理,......
OpenCV 提供了一些已经训练好的级联分类器,这些级联分类器以XML文件的方式保存在以下路径中:
...\Python\Lib\site-packages\cv2\data\
OpenCV提供了一些经过预训练的人脸检测器模型文件,这些文件通常包含在OpenCV的安装包中。你也可以在OpenCV的官方GitHub页面或者OpenCV官方网站的下载页面找到这些模型文件的下载链接。
一般来说,你可以从以下位置获取OpenCV的预训练模型文件:
OpenCV GitHub Release 页面:在 Releases · opencv/opencv · GitHub 找到你需要的版本,然后在下载的压缩包中找到位于 opencv\data 目录下的人脸检测器模型文件。
OpenCV 官方网站下载页面:访问 OpenCV 官方网站 Releases - OpenCV ,下载你需要的版本,并在相应的压缩包中查找人脸检测器模型文件。
请确保下载与你使用的OpenCV版本兼容的模型文件。
二、简单行人人体检测效果实现原理
行人检测是计算机视觉中的一个重要任务,旨在从图像或视频中检测和定位人类行人的位置。这项任务通常涉及以下步骤:
-
特征提取:通常使用特征提取算法,如 Haar 特征、HOG(方向梯度直方图)特征或深度学习模型,从图像中提取用于识别行人的特征。
-
分类器训练:使用机器学习技术(如支持向量机、随机森林等)或深度学习模型,对提取的特征进行训练,以区分行人和非行人的图像。
-
行人检测:将训练好的分类器应用于输入图像或视频流,以识别其中的行人。在此阶段,通常会使用滑动窗口技术在图像中不同的位置和尺度上进行检测。
-
定位和标注:一旦检测到行人,通常会在图像上绘制矩形框或边界框来标记他们的位置。
-
性能评估:对行人检测算法进行评估和性能分析,以确定其在不同数据集上的准确性和鲁棒性。
行人检测在许多领域都有重要应用,包括智能监控系统、自动驾驶汽车、人机交互、无人机和机器人导航等。
实现原理:
- 使用 OpenCV 加载行人检测器,这里使用的是 Haar 级联分类器。
- 读取视频文件的每一帧,并将每一帧转换为灰度图像。
- 在灰度图像中使用行人检测器检测行人的位置。
- 对于检测到的每个行人,绘制一个矩形框来标记其位置。
- 将带有矩形框的图像显示出来,直到按下 'q' 键退出。
实现方法:
- 加载 Haar 级联分类器用于行人检测。
- 使用
VideoCapture
对象从给定的视频文件中读取帧。- 将每一帧转换为灰度图像,并使用
detectMultiScale
函数检测行人。- 对于每个检测到的行人,使用
rectangle
函数绘制一个矩形框。- 循环遍历直到视频结束或者按下 'q' 键退出,然后释放资源。
涉及的一些函数说明,如下
cv2.CascadeClassifier
:
- 作用:加载 Haar 级联分类器,用于行人检测。
- 参数:
filename
(str):级联分类器的文件路径。- 返回值:
cv2.CascadeClassifier
对象。
cv2.VideoCapture
:
- 作用:创建一个视频捕获对象,用于从给定的视频文件中读取帧。
- 参数:
filename
(str):要读取的视频文件的路径。- 返回值:
cv2.VideoCapture
对象。
cv2.cvtColor
:
- 作用:将图像从一种颜色空间转换为另一种颜色空间。
- 参数:
src
(numpy.ndarray):输入图像。code
(int):颜色空间转换代码,如cv2.COLOR_BGR2GRAY
表示从 BGR(彩色)到灰度的转换。- 返回值:转换后的图像。
detectMultiScale
:
- 作用:在图像中检测对象的多个实例,例如人脸或行人。
- 参数:
image
(numpy.ndarray):输入图像,灰度图像通常用于人脸或行人检测。scaleFactor
(float):每个图像缩小的比例尺寸。minNeighbors
(int):每个候选矩形应该保留多少个邻居。minSize
(tuple):对象的最小尺寸。- 返回值:检测到的对象的矩形列表。
cv2.rectangle
:
- 作用:在图像上绘制矩形。
- 参数:
img
(numpy.ndarray):输入图像。pt1
(tuple):矩形的一个顶点。pt2
(tuple):矩形对角线上的另一个顶点。color
(tuple 或 int):矩形的颜色,可以是 RGB 颜色元组或灰度值。thickness
(int):矩形边框的厚度。- 返回值:修改后的图像。
cv2.imshow
:
- 作用:在窗口中显示图像。
- 参数:
winname
(str):窗口名称。mat
(numpy.ndarray):要显示的图像。- 返回值:无。
cv2.waitKey
:
- 作用:等待键盘输入。
- 参数:
delay
(int):等待时间,单位为毫秒。- 返回值:按下的键的 ASCII 码。
cv2.destroyAllWindows
:
- 作用:关闭所有 OpenCV 窗口。
- 参数:无。
- 返回值:无。
VideoCapture.release
:
- 作用:释放视频捕获对象的资源。
- 参数:无。
- 返回值:无。
三、简单行人人体检测效果案例实现简单步骤
1、编写代码
2、运行效果
3、具体代码
python
"""
简单行人人体检测效果
1、加载 Haar 级联分类器用于行人检测。
2、使用 VideoCapture 对象从给定的视频文件中读取帧。
3、将每一帧转换为灰度图像,并使用 detectMultiScale 函数检测行人。
4、对于每个检测到的行人,使用 rectangle 函数绘制一个矩形框。
5、循环遍历直到视频结束或者按下 'q' 键退出,然后释放资源。
"""
import cv2
def detect_and_draw_pedestrians(video_path, scale_factor=1.1, min_neighbors=5, min_size=(30, 30)):
"""
检测视频中的行人并绘制矩形框
:param video_path: (str) 输入视频文件的路径
:param scale_factor: (float) 检测窗口的缩放比例,默认为1.1
:param min_neighbors: (int) 每个候选矩形应该保留的邻近矩形的数量阈值,默认为5
:param min_size: (tuple) 行人矩形的最小尺寸,格式为(w, h),默认为(30, 30)
:return:
"""
# 参数安全校验
if not isinstance(video_path, str) or not video_path.strip():
raise ValueError("Invalid video path.")
if not isinstance(scale_factor, (int, float)) or scale_factor <= 1.0:
raise ValueError("Scale factor must be a positive float greater than 1.0.")
if not isinstance(min_neighbors, int) or min_neighbors < 0:
raise ValueError("Min neighbors must be a non-negative integer.")
if not isinstance(min_size, tuple) or len(min_size) != 2 or not all(isinstance(val, int) for val in min_size) or \
min_size[0] <= 0 or min_size[1] <= 0:
raise ValueError("Min size must be a tuple of two positive integers.")
# 加载行人检测器
pedestrian_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_fullbody.xml')
# 读取视频文件
video_capture = cv2.VideoCapture(video_path)
while True:
# 读取一帧视频
ret, frame = video_capture.read()
if not ret:
break
# 将图像转换为灰度图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 检测行人
pedestrians = pedestrian_cascade.detectMultiScale(gray, scaleFactor=scale_factor, minNeighbors=min_neighbors,
minSize=min_size)
# 绘制矩形框
for (x, y, w, h) in pedestrians:
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 显示结果
cv2.imshow('Pedestrian Detection', frame)
# 按 'q' 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放视频捕获对象
video_capture.release()
cv2.destroyAllWindows()
# 测试接口函数
if __name__ == "__main__":
video_path = 'Videos/TwoPeopleRunning.mp4'
detect_and_draw_pedestrians(video_path, scale_factor=1.2, min_neighbors=3, min_size=(50, 50))
四、注意事项
- 确保提供的视频文件路径是正确的,视频文件存在并且格式正确。
- 适当调整
detectMultiScale
函数的参数以达到最佳的行人检测效果。 - 处理视频时可能会遇到视频帧的分辨率、帧率等问题,需要考虑处理效率。
- 为了提高检测效率,可以在视频的每几帧上进行行人检测,而不是每一帧都进行检测。
- 释放视频捕获对象和关闭窗口的代码应该在所有帧都处理完毕后执行,以避免资源泄露。