iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python+OpenCV内置方法如何实现行人检测
  • 451
分享到

Python+OpenCV内置方法如何实现行人检测

2023-06-22 03:06:56 451人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

小编给大家分享一下python+OpenCV内置方法如何实现行人检测,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!您是否知道 OpenCV 具有执行行人检测的内置

小编给大家分享一下python+OpenCV内置方法如何实现行人检测,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

您是否知道 OpenCV 具有执行行人检测的内置方法?

OpenCV 附带一个预训练的 HOG + 线性 SVM 模型,可用于在图像和视频流中执行行人检测。

今天我们使用Opencv自带的模型实现对视频流中的行人检测,只需打开一个新文件,将其命名为 detect.py ,然后加入代码:

# import the necessary packagesfrom __future__ import print_functionimport numpy as npimport argparseimport cv2import os

导入需要的包,然后定义项目需要的方法。

def nms(boxes, probs=None, overlapThresh=0.3):    # if there are no boxes, return an empty list    if len(boxes) == 0:        return []    # if the bounding boxes are integers, convert them to floats -- this    # is important since we'll be doing a bunch of divisions    if boxes.dtype.kind == "i":        boxes = boxes.astype("float")    # initialize the list of picked indexes    pick = []    # grab the coordinates of the bounding boxes    x1 = boxes[:, 0]    y1 = boxes[:, 1]    x2 = boxes[:, 2]    y2 = boxes[:, 3]    # compute the area of the bounding boxes and grab the indexes to sort    # (in the case that no probabilities are provided, simply sort on the    # bottom-left y-coordinate)    area = (x2 - x1 + 1) * (y2 - y1 + 1)    idxs = y2    # if probabilities are provided, sort on them instead    if probs is not None:        idxs = probs    # sort the indexes    idxs = np.argsort(idxs)    # keep looping while some indexes still remain in the indexes list    while len(idxs) > 0:        # grab the last index in the indexes list and add the index value        # to the list of picked indexes        last = len(idxs) - 1        i = idxs[last]        pick.append(i)        # find the largest (x, y) coordinates for the start of the bounding        # box and the smallest (x, y) coordinates for the end of the bounding        # box        xx1 = np.maximum(x1[i], x1[idxs[:last]])        yy1 = np.maximum(y1[i], y1[idxs[:last]])        xx2 = np.minimum(x2[i], x2[idxs[:last]])        yy2 = np.minimum(y2[i], y2[idxs[:last]])        # compute the width and height of the bounding box        w = np.maximum(0, xx2 - xx1 + 1)        h = np.maximum(0, yy2 - yy1 + 1)        # compute the ratio of overlap        overlap = (w * h) / area[idxs[:last]]        # delete all indexes from the index list that have overlap greater        # than the provided overlap threshold        idxs = np.delete(idxs, np.concatenate(([last],                                               np.where(overlap > overlapThresh)[0])))    # return only the bounding boxes that were picked    return boxes[pick].astype("int")image_types = (".jpg", ".jpeg", ".png", ".bmp", ".tif", ".tiff")def list_images(basePath, contains=None):    # return the set of files that are valid    return list_files(basePath, validExts=image_types, contains=contains)def list_files(basePath, validExts=None, contains=None):    # loop over the directory structure    for (rootDir, dirNames, filenames) in os.walk(basePath):        # loop over the filenames in the current directory        for filename in filenames:            # if the contains string is not none and the filename does not contain            # the supplied string, then ignore the file            if contains is not None and filename.find(contains) == -1:                continue            # determine the file extension of the current file            ext = filename[filename.rfind("."):].lower()            # check to see if the file is an image and should be processed            if validExts is None or ext.endswith(validExts):                # construct the path to the image and yield it                imagePath = os.path.join(rootDir, filename)                yield imagePathdef resize(image, width=None, height=None, inter=cv2.INTER_AREA):    dim = None    (h, w) = image.shape[:2]    # 如果高和宽为None则直接返回    if width is None and height is None:        return image    # 检查宽是否是None    if width is None:        # 计算高度的比例并并按照比例计算宽度        r = height / float(h)        dim = (int(w * r), height)    # 高为None    else:        # 计算宽度比例,并计算高度        r = width / float(w)        dim = (width, int(h * r))    resized = cv2.resize(image, dim, interpolation=inter)    # return the resized image    return resized

nms函数:非极大值抑制。

list_images:读取图片。

resize:等比例改变大小。

# construct the argument parse and parse the argumentsap = argparse.ArgumentParser()ap.add_argument("-i", "--images", default='test1', help="path to images directory")args = vars(ap.parse_args())# 初始化 HOG 描述符/人物检测器hog = cv2.HOGDescriptor()hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())

定义输入图片的文件夹路径。

初始化HOG检测器。

# loop over the image pathsfor imagePath in list_images(args["images"]):    # 加载图像并调整其大小以    # (1)减少检测时间    # (2)提高检测精度    image = cv2.imread(imagePath)    image = resize(image, width=min(400, image.shape[1]))    orig = image.copy()    print(image)    # detect people in the image    (rects, weights) = hog.detectMultiScale(image, winStride=(4, 4),                                            padding=(8, 8), scale=1.05)    # draw the original bounding boxes    print(rects)    for (x, y, w, h) in rects:        cv2.rectangle(orig, (x, y), (x + w, y + h), (0, 0, 255), 2)    # 使用相当大的重叠阈值对边界框应用非极大值抑制,以尝试保持仍然是人的重叠框    rects = np.array([[x, y, x + w, y + h] for (x, y, w, h) in rects])    pick = nms(rects, probs=None, overlapThresh=0.65)    # draw the final bounding boxes    for (xA, yA, xB, yB) in pick:        cv2.rectangle(image, (xA, yA), (xB, yB), (0, 255, 0), 2)    # show some infORMation on the number of bounding boxes    filename = imagePath[imagePath.rfind("/") + 1:]    print("[INFO] {}: {} original boxes, {} after suppression".format(        filename, len(rects), len(pick)))    # show the output images    cv2.imshow("Before NMS", orig)    cv2.imshow("After NMS", image)    cv2.waiTKEy(0)

遍历 --images 目录中的图像。

然后,将图像调整为最大宽度为 400 像素。尝试减少图像尺寸的原因有两个:

  • 减小图像大小可确保需要评估图像金字塔中的滑动窗口更少(即从线性 SVM 中提取 HOG 特征,然后将其传递给线性 SVM),从而减少检测时间(并提高整体检测吞吐量)。

  • 调整我们的图像大小也提高了我们行人检测的整体准确性(即更少的误报)。

通过调用 hog 描述符的 detectMultiScale 方法,检测图像中的行人。 detectMultiScale 方法构造了一个比例为1.05 的图像金字塔,滑动窗口步长分别为x 和y 方向的(4, 4) 个像素。

滑动窗口的大小固定为 64 x 128 像素,正如开创性的 Dalal 和 Triggs 论文《用于人体检测的定向梯度直方图》所建议的那样。 detectMultiScale 函数返回 rects 的 2 元组,或图像中每个人的边界框 (x, y) 坐标和 weights ,SVM 为每次检测返回的置信度值。

较大的尺度大小将评估图像金字塔中的较少层,这可以使算法运行得更快。然而,规模太大(即图像金字塔中的层数较少)会导致行人无法被检测到。同样,过小的比例尺会显着增加需要评估的图像金字塔层的数量。这不仅会造成计算上的浪费,还会显着增加行人检测器检测到的误报数量。也就是说,在执行行人检测时,比例是要调整的最重要的参数之一。我将在以后的博客文章中对每个参数进行更彻底的审查以检测到多尺度。

获取初始边界框并将它们绘制在图像上。

但是,对于某些图像,您会注意到每个人检测到多个重叠的边界框。

在这种情况下,我们有两个选择。我们可以检测一个边界框是否完全包含在另一个边界框内。或者我们可以应用非最大值抑制并抑制与重要阈值重叠的边界框。

应用非极大值抑制后,得到最终的边界框,然后输出图像。

运行结果:

nms前:

Python+OpenCV内置方法如何实现行人检测

nms后:

Python+OpenCV内置方法如何实现行人检测

以上是“Python+OpenCV内置方法如何实现行人检测”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网Python频道!

--结束END--

本文标题: Python+OpenCV内置方法如何实现行人检测

本文链接: https://www.lsjlt.com/news/302280.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python+OpenCV内置方法实现行人检测
    您是否知道 OpenCV 具有执行行人检测的内置方法? OpenCV 附带一个预训练的 HOG + 线性 SVM 模型,可用于在图像和视频流中执行行人检测。 今天我们使用Opencv...
    99+
    2022-11-12
  • Python+OpenCV内置方法如何实现行人检测
    小编给大家分享一下Python+OpenCV内置方法如何实现行人检测,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!您是否知道 OpenCV 具有执行行人检测的内置...
    99+
    2023-06-22
  • 如何实现基于opencv的行人检测
    这篇文章主要为大家展示了“如何实现基于opencv的行人检测”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现基于opencv的行人检测”这篇文章吧。基于方向梯度直方图(HOG)/线性支持向...
    99+
    2023-06-22
  • Python OpenCV Canny边缘检测算法如何实现
    本文小编为大家详细介绍“Python OpenCV Canny边缘检测算法如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python OpenCV Canny边缘检测算法如何实现”文章能帮助...
    99+
    2023-07-02
  • Python OpenCV Hough直线检测算法如何实现
    这篇文章主要介绍了Python OpenCV Hough直线检测算法如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python OpenCV Hough直线检测算...
    99+
    2023-07-02
  • Python中利用opencv实现缺陷检测的方法
    这篇文章给大家分享的是有关Python中利用opencv实现缺陷检测的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型)、lo...
    99+
    2023-06-14
  • Python+OpenCV图像边缘检测四种实现方法
    目录1.Sobel算子2.Schaar算子(更能体现细节)3.Laplacian算子(基于零穿越的,二阶导数的0值点)4.Canny边缘检测(被认为是最优的边缘检测算法)总结 im...
    99+
    2022-11-12
  • opencv+mediapipe如何实现人脸检测及摄像头实时示例
    这篇文章主要为大家展示了“opencv+mediapipe如何实现人脸检测及摄像头实时示例”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“opencv+mediapipe如何实现人脸检测及摄像头实...
    99+
    2023-06-22
  • Deepsort + Yolo 实现行人检测和轨迹追踪的方法
    目录引言基本介绍1.1 环境要求1.2 算法设计行人检测2.1 YOLO行人检测2.2 Deepsort行人跟踪引言 行人检测是近年来计算机视觉领域的研究热点,同时也是目标检测领域中...
    99+
    2022-11-12
  • OpenCV-Python如何实现人脸磨皮算法
    这篇文章将为大家详细讲解有关OpenCV-Python如何实现人脸磨皮算法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。人脸磨皮是最基础的人脸美颜效果。主要分为祛斑,祛痘,淡化黑眼圈等步骤。通过前面的学习...
    99+
    2023-06-15
  • OpenCV-Python如何实现人脸美白算法
    这篇文章主要介绍了OpenCV-Python如何实现人脸美白算法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。人脸美白原理人脸美白原理说透了,就是一种图像的颜色空间处理,所以...
    99+
    2023-06-15
  • python+mediapipe+opencv如何实现手部关键点检测功能
    今天给大家介绍一下python+mediapipe+opencv如何实现手部关键点检测功能。,文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。一、mediapip...
    99+
    2023-06-26
  • 如何基于OpenCV&Python实现霍夫变换圆形检测
    简述 基于python使用opencv实现在一张图片中检测出圆形,并且根据坐标和半径标记出圆。不涉及理论,只讲应用。 霍夫变换检测圆形的原理 其实检测圆形和检测直线的原理差别不大...
    99+
    2022-11-12
  • 树莓派上如何利用python+opencv+dlib实现嘴唇检测
    小编给大家分享一下树莓派上如何利用python+opencv+dlib实现嘴唇检测,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!树莓派上利用python+opencv+dlib实现嘴唇检测项目的目标是在树莓派上运行pyth...
    99+
    2023-06-25
  • 如何在python中使用opencv实现一个颜色检测功能
    本文章向大家介绍如何在python中使用opencv实现一个颜色检测功能的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络...
    99+
    2023-06-06
  • android 如何进行内存泄漏检测及解决方法
    内存泄漏是在Android开发中常见的问题之一,它可能导致应用的内存占用逐渐增加,最终影响应用的性能和稳定性。以下是一些常见的方法来进行内存泄漏检测和解决: 1. 使用工具进行内存泄漏检测: Andr...
    99+
    2023-10-03
    android
  • Python中图像边缘检测算法如何实现
    这篇“Python中图像边缘检测算法如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python中图像边缘检测算法如何...
    99+
    2023-06-30
  • Ajax如何实现网站劫持的检测方法
    这篇文章将为大家详细讲解有关Ajax如何实现网站劫持的检测方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。https可以彻底解决劫持的问题。但是一般虚拟主机都不支持 https,难道http只能任流氓们...
    99+
    2023-06-08
  • 如何利用Python+OpenCV实现简易图像边缘轮廓检测(零基础)
    目录前言函数基础与三方库cv.threshold(pic,thresh,maxvalue,model)cv.findContours(待处理图片,model(提取模式),method...
    99+
    2022-11-11
  • js如何实现检测类数组对象的函数方法
    这篇文章将为大家详细讲解有关js如何实现检测类数组对象的函数方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。如下所示://判定o是否是一个类数组对象 //字符串和函数有...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作