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官方网站的下载页面找到这些模型文件的下载链接。

二、简单行人人体检测效果实现原理

行人检测是计算机视觉中的一个重要任务,旨在从图像或视频中检测和定位人类行人的位置。这项任务通常涉及以下步骤:

  1. 特征提取:通常使用特征提取算法,如 Haar 特征、HOG(方向梯度直方图)特征或深度学习模型,从图像中提取用于识别行人的特征。

  2. 分类器训练:使用机器学习技术(如支持向量机、随机森林等)或深度学习模型,对提取的特征进行训练,以区分行人和非行人的图像。

  3. 行人检测:将训练好的分类器应用于输入图像或视频流,以识别其中的行人。在此阶段,通常会使用滑动窗口技术在图像中不同的位置和尺度上进行检测。

  4. 定位和标注:一旦检测到行人,通常会在图像上绘制矩形框或边界框来标记他们的位置。

  5. 性能评估:对行人检测算法进行评估和性能分析,以确定其在不同数据集上的准确性和鲁棒性。

行人检测在许多领域都有重要应用,包括智能监控系统、自动驾驶汽车、人机交互、无人机和机器人导航等。

涉及的一些函数说明,如下

三、简单行人人体检测效果案例实现简单步骤

1、编写代码

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之四 简单行人人体检测效果-LMLPHP

2、运行效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之四 简单行人人体检测效果-LMLPHP

3、具体代码

"""
简单行人人体检测效果
    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))

四、注意事项

  1. 确保提供的视频文件路径是正确的,视频文件存在并且格式正确。
  2. 适当调整 detectMultiScale 函数的参数以达到最佳的行人检测效果。
  3. 处理视频时可能会遇到视频帧的分辨率、帧率等问题,需要考虑处理效率。
  4. 为了提高检测效率,可以在视频的每几帧上进行行人检测,而不是每一帧都进行检测。
  5. 释放视频捕获对象和关闭窗口的代码应该在所有帧都处理完毕后执行,以避免资源泄露。
04-23 07:44