OpenCV实例(六)行人检测

这篇具有很好参考价值的文章主要介绍了OpenCV实例(六)行人检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者:Xiou

1.行人检测概述

行人检测是目标检测的一个分支。目标检测的任务是从图像中识别出预定义类型目标,并确定每个目标的位置。用来检测行人的目标检测系统被称为行人检测系统。

行人检测主要用来判断输入图片(或视频)内是否包含行人。若检测到行人,则给出其具体的位置信息。该位置信息是智能视频监控、人体行为分析、智能驾驶、智能机器人等应用的关键基础。由于行人可能处于移动状态,也可能处于静止状态,且外观容易受到体型、姿态、衣着、拍摄角度、遮挡等多种因素的影响,因此行人检测在计算机视觉领域内成为研究热点与难点。

一种比较常用的行人检测方式是统计学习方法,即根据大量样本构建行人检测分类器。提取的特征主要有目标的灰度、边缘、纹理、颜色、梯度等信息。分类器主要包括人工神经网络、SVM、Adaboost及卷积神经网络等。

OpenCV采用的行人检测算法是基于Dalal的论文实现的,我们可以直接调用行人检测器实现行人检测。

2.行人检测基础实现

2.1基本流程

在OpenCV中直接调用行人检测器即可完成行人检测,具体过程如下:

● 调用hog=cv2.HOGDescriptor(),初始化HOG描述符。
● 调用setVMDetector,将SVM设置为预训练的行人检测器。该检测器通过cv2.HOGDescriptor_getDefaultPeopleDetector()函数加载。

● 使用detectMultiScale函数检测图像中的行人,返回值为行人对应的矩形框和矩形框的权重值。在该函数中待检测图像是必选参数,除此之外,还有若干个很重要的可选参数,19.3节将对这些可选参数进行介绍。

2.2实现程序

代码实例:使用OpenCV自带的行人检测器实现行人检测。

import cv2
image = cv2.imread("back.jpg")            
hog = cv2.HOGDescriptor()   #初始化方向梯度直方图描述子
#设置SVM为一个预先训练好的行人检测器
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())  
#调用函数detectMultiScale,检测行人对应的边框
(rects, weights) = hog.detectMultiScale(image)
#遍历每一个矩形框,将之绘制在图像上
for (x, y, w, h) in rects:  
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.imshow("image", image)     #显示检测结果
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果:

OpenCV实例(六)行人检测

从本例的运行结果可以看出,当前识别效果还不错。但是,在面对复杂情况时,该程序的识别效果将差很多,还需要进一步的优化。

2.3参数优化

OpenCV为了提高自带的行人检测器的识别准确率提供了非常多的参数。函数detectMultiScale的语法格式如下:

OpenCV实例(六)行人检测
其中:
● rects表示检测到的行人对应的矩形框。
● weights表示矩形框的权重值。
● image表示待检测行人的输入图像。
● winStride表示HOG检测窗口移动步长。
● padding表示边缘扩充的像素个数。
● scale表示构造金字塔结构图像时使用的缩放因子,默认值为1.05。
● useMeanshiftGrouping表示是否消除重叠的检测结果。

参数winStride

● WinStride值越小,覆盖的对象越多,能够找到的对象越多,但是运算效率会降低。● WinStride值越大,覆盖的对象越少,能够找到的对象越少,但是运算效率会提高,具有更好的实时性。通常,需要在实时性和提取精度之间取得平衡。一般,将WinStride设置为(4,4)会有比较好的效果。

代码实例:观察不同的winStride值的使用情况


import cv2
import time
def detect(image,winStride):
    imagex=image.copy()   #函数内部做个副本,让每个函数运行在不同的图像上        
    hog = cv2.HOGDescriptor()   #初始化方向梯度直方图描述子
    #设置SVM为一个预先训练好的行人检测器
    hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())  
    #调用函数detectMultiScale,检测行人对应的边框
    time_start = time.time()     #记录开始时间
    #获取(行人对应的矩形框、对应的权重)
    (rects, weights) = hog.detectMultiScale(imagex,winStride=winStride)    
    time_end = time.time()    #记录结束时间
    # 绘制每一个矩形框
    for (x, y, w, h) in rects:  
        cv2.rectangle(imagex, (x, y), (x + w, y + h), (0, 0, 255), 2)
    print("size:",winStride,",time:",time_end-time_start)
    name=str(winStride[0]) + "," + str(winStride[0])
    cv2.imshow(name, imagex)     #显示原始效果
    # cv2.imwrite( str(time.time())+".bmp" ,imagex)   #保存,书稿用的
image = cv2.imread("back.jpg") 
detect(image,(4,4))
detect(image,(12,12))
detect(image,(24,24))
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果:

OpenCV实例(六)行人检测
从程序输出结果可以看出,当步长较小时,遍历的区域更多,花费的时间更长。

参数padding

代码实例:观察参数padding不同值的检测效果。

import cv2
import time
def detect(image,padding):
    imagex=image.copy()   #函数内部做个副本,让每个函数运行在不同的图像上        
    hog = cv2.HOGDescriptor()   #初始化方向梯度直方图描述子
    #设置SVM为一个预先训练好的行人检测器
    hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())  
    #调用函数detectMultiScale,检测行人对应的边框
    time_start = time.time()     #记录开始时间
    #获取(行人对应的矩形框、对应的权重)
    (rects, weights) = hog.detectMultiScale(imagex,
                        winStride=(16,16),padding=padding)    
    time_end = time.time()    #记录结束时间
    # 绘制每一个矩形框
    for (x, y, w, h) in rects:  
        cv2.rectangle(imagex, (x, y), (x + w, y + h), (0, 0, 255), 2)
    print("Padding size:",padding,",time:",time_end-time_start)
    name=str(padding[0]) + "," + str(padding[0])
    cv2.imshow(name, imagex)     #显示原始效果
image = cv2.imread("backPadding2.jpg") 
detect(image,(0,0))
detect(image,(8,8))
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果:

OpenCV实例(六)行人检测
由程序输出结果可以看出,在扩边后可检测到靠近图像边缘的行人,但是运算量加大,耗时更长。

参数scale

参数scale是检测过程构造金字塔结构图像使用的比例值。

代码实例:观察不同scale参数值的检测效果


import cv2
import time
def detect(image,scale):
    imagex=image.copy()   #函数内部做个副本,让每个函数运行在不同的图像上        
    hog = cv2.HOGDescriptor()   #初始化方向梯度直方图描述子
    #设置SVM为一个预先训练好的行人检测器
    hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())  
    #调用函数detectMultiScale,检测行人对应的边框
    time_start = time.time()     #记录开始时间
    #获取(行人对应的矩形框、对应的权重)
    (rects, weights) = hog.detectMultiScale(imagex,scale=scale)    
    time_end = time.time()    #记录结束时间
    # 绘制每一个矩形框
    for (x, y, w, h) in rects:  
        cv2.rectangle(imagex, (x, y), (x + w, y + h), (0, 0, 255), 2)
    print("sacle size:",scale,",time:",time_end-time_start)
    name=str(scale) 
    cv2.imshow(name, imagex)     #显示原始效果
image = cv2.imread("back.jpg") 
detect(image,1.01)
detect(image,1.05)
detect(image,1.3)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果:

OpenCV实例(六)行人检测

从程序输出结果可以看出,使用小的scale值能够更好地检测到图像内的行人目标,但是耗时较长;使用较大的scale值,速度较快,实时性好,但是可能会发生漏检。因此,需要在二者之间取得平衡。通常情况下,scale值的设置范围为[1.01,1.5]。

参数useMeanshiftGrouping
参数useMeanshiftGrouping用来控制是否消除重叠的检测结果。

代码实例:观察重叠边界处理结果

import cv2
import time
def detect(image,useMeanshiftGrouping):
    imagex=image.copy()   #函数内部做个副本,让每个函数运行在不同的图像上        
    hog = cv2.HOGDescriptor()   #初始化方向梯度直方图描述子
    #设置SVM为一个预先训练好的行人检测器
    hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())  
    #调用函数detectMultiScale,检测行人对应的边框
    time_start = time.time()     #记录开始时间
    #获取(行人对应的矩形框、对应的权重)
    (rects, weights) = hog.detectMultiScale(imagex,
                            scale=1.01,
                            useMeanshiftGrouping=useMeanshiftGrouping)    
    time_end = time.time()    #记录结束时间
    # 绘制每一个矩形框
    for (x, y, w, h) in rects:  
        cv2.rectangle(imagex, (x, y), (x + w, y + h), (0, 0, 255), 2)
    print("useMeanshiftGrouping:",useMeanshiftGrouping,",time:",time_end-time_start)
    name=str(useMeanshiftGrouping) 
    cv2.imshow(name, imagex)     #显示原始效果
image = cv2.imread("back.jpg") 
detect(image,False)
detect(image,True)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果:
OpenCV实例(六)行人检测

3.完整行人检测程序

代码实例:

import cv2
def detect(image,winStride,padding,scale,useMeanshiftGrouping):   
    hog = cv2.HOGDescriptor()   #初始化方向梯度直方图描述子
    #设置SVM为一个预先训练好的行人检测器
    hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())  
    #获取(行人对应的矩形框、对应的权重)
    (rects, weights) = hog.detectMultiScale(image,
                            winStride = winStride,
                            padding = padding,
                            scale = scale,
                            useMeanshiftGrouping=useMeanshiftGrouping)    
    # 绘制每一个矩形框
    for (x, y, w, h) in rects:  
        cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
    cv2.imshow("result", image)     #显示原始效果
image = cv2.imread("back.jpg") 
winStride = (8,8)
padding = (2,2)
scale = 1.03
useMeanshiftGrouping=True
detect(image,winStride,padding,scale,useMeanshiftGrouping)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果:

OpenCV实例(六)行人检测文章来源地址https://www.toymoban.com/news/detail-470933.html

到了这里,关于OpenCV实例(六)行人检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

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

    目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之四 简单行人人体检测效果 一、简单介绍 二、简单行人人体检测效果实现原理 三、简单行人人体检测效果案例实现简单步骤 四、注意事项 Python是一种跨平台的计算机程序设计语言。是一种面向对

    2024年04月26日
    浏览(36)
  • opencv-python学习笔记(十一):HOG+SVM进行行人检测全过程

    本次是接着python-opencv学习笔记(七):滑动窗口与图像金字塔 一起在实验楼所做实验,为啥中间隔了四篇才接着发出来,主因是我发文比较随意(懒),当时这部分并没有总结完,至少我感觉我看的相关资料还不够多,整体理解不深,另外就是项目需求,在做很多其它的东

    2024年02月05日
    浏览(37)
  • 【opencv】示例-peopledetect.cpp HOG(方向梯度直方图)描述子和SVM(支持向量机)进行行人检测...

    本段代码是一个使用OpenCV库的 HOG(Histogram of Oriented Gradients,方向梯度直方图)描述子和SVM(Support Vector Machines,支持向量机)进行行人检测的程序 。程序定义了Detector类来执行行人检测,可以在两种模式(默认模式和戴姆勒模式)之间切换。通过命令行参数,用户可以选择是

    2024年04月14日
    浏览(43)
  • OpenCV实例(一)人脸检测

    作者:Xiou 计算机视觉使很多任务成为现实,其中两项任务就是人脸检测(在图像中定位人脸)和人脸识别(将人脸识别为特定的人)。OpenCV实现了一些人脸检测和识别的算法。从安全到娱乐,这些技术在现实环境中都有应用。 介绍OpenCV的一些人脸检测和识别功能,并定义特

    2024年02月09日
    浏览(29)
  • OpenCV实例(七)汽车检测

    作者:Xiou 对于图像和视频检测中的目标类型并没有具体限制,但是,为了使结果的准确度在可接受范围内,需要一个足够大的数据集,包括训练图像的大小要一样。如果由自己构建这样的数据集(这是完全可能的)将会非常耗时。 可利用现成的数据集,在网上可以免费下载

    2023年04月20日
    浏览(24)
  • OpenCV实例(九)基于深度学习的运动目标检测(一)YOLO运动目标检测算法

    2012年,随着深度学习技术的不断突破,开始兴起基于深度学习的目标检测算法的研究浪潮。 2014年,Girshick等人首次采用深度神经网络实现目标检测,设计出R-CNN网络结构,实验结果表明,在检测任务中性能比DPM算法优越。同时,何恺明等人针对卷积神经网络(Convolutional Neura

    2024年02月13日
    浏览(39)
  • 人脸检测和行人检测3:Android实现人脸检测和行人检测检测(含源码,可实时检测)

      目录 人脸检测和行人检测3:Android实现人脸检测和行人检测(含源码,可实时检测) 1. 前言 2. 人脸检测和行人检测数据集说明 3. 基于YOLOv5的人脸检测和行人检测模型训练 4.人脸检测和行人检测模型Android部署 (1) 将Pytorch模型转换ONNX模型 (2) 将ONNX模型转换为TNN模型 (3)

    2024年02月03日
    浏览(30)
  • OpenCV4.x图像处理实例-YOLO v8检测与识别物体

    本文将详细介绍通过OpenCV的DNN模块,使用YOLO V8模型进行对静态图像、视频流和摄像头进行物体检测与识别。 YOLO v8 (You Only Look Once)由 Ultralytics 开发的一种先进的 (SOTA) 模型。它建立在以前成功的 YOLO 版本的基础上,并引入了新的功能和改进,以进一步提高性能和灵活性。

    2024年02月08日
    浏览(51)
  • OpenCV实例(九)基于深度学习的运动目标检测(三)YOLOv3识别物体

    目标检测,粗略地说就是输入图片/视频,经过处理后得到目标的位置信息(比如左上角和右下角的坐标)、目标的预测类别、目标的预测置信度。前面我们阐述了不少理论知识,现在需要动手实战了。对于初学者来说,自己实现YOLO算法不太现实,幸运的是OpenCV的DNN(Deep Neur

    2024年02月12日
    浏览(44)
  • 技术写作及技术作者的概述和重要性 - 了解技术写

    技术写作是指用简单易懂的语言向特定受众解释复杂概念的一种写作形式。这种写作形式通常用于工程、计算机硬件和软件、金融、消费电子和生物技术等领域。技术作者的主要目标是简化复杂信息并以清晰简洁的方式呈现。技术作者的职责可能包括创建操作指南、用户手册

    2024年02月05日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包