python使用opencv实现识别指定区域的行人

这篇具有很好参考价值的文章主要介绍了python使用opencv实现识别指定区域的行人。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、案例介绍

        案例实现对视频中的行人进行实时检测,并可在视频画面通过鼠标绘制矩形区域,行人经过区域内后,程序会进行判断行人已进入该区域,行人检测框颜色将变为蓝色。该程序主要使用python的opencv模块实现,实现流程:首先利用Haar分类器实现行人检测功能,其次利用opencv鼠标事件框选矩形区域,计算行人中心点,判断如果中心点在区域内后,就对行人检测框进行颜色的转变。

pythonopencv检测行人,OpenCv,opencv,python,计算机视觉 

2、案例实现

  • 实现行人检测,加载Haar的人体识别器模型,读取视频流每一帧,使用矩形绘制方法rectangle绘制出行人。
import cv2
if __name__ == '__main__':
    # 加载Haar级联分类器模型
    cascade_classifier = cv2.CascadeClassifier('./model/haarcascade_fullbody.xml')

    # 加载视频
    video_capture = cv2.VideoCapture('./data/test.mp4')
    cv2.namedWindow('image')
    while True:
        # 获取视频的一帧
        ret, frame = video_capture.read()

        # 转换为灰度图像
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # 检测人体
        bodies = cascade_classifier.detectMultiScale(gray, 1.1, 4)

        # 在图像上绘制人体框并显示
        for (x, y, w, h) in bodies:
            cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

        cv2.imshow('image', frame)

        # 按'q'键退出
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    # 释放资源
    video_capture.release()
    cv2.destroyAllWindows()
  • 实现鼠标事件绘制矩形,通过opencv的事件监听器,获取矩形对角线的两点并通过rectangle方法将矩形绘制出来。
import cv2
import numpy as np

# 鼠标事件
def OnMouseAction(event, x, y, flags, param):
    global position1, position2
    if event == cv2.EVENT_LBUTTONDOWN:  # 按下左键
        position1 = (x, y)
        position2 = None

    elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:  # 按住左键拖曳不放开
        position2 = (x, y)

    elif event == cv2.EVENT_LBUTTONUP:  # 放开左键q
        position2 = (x, y)

if __name__ == '__main__':
    # 加载Haar级联分类器模型
    cascade_classifier = cv2.CascadeClassifier('./model/haarcascade_fullbody.xml')

    # 加载视频
    video_capture = cv2.VideoCapture('./data/test.mp4')
    cv2.namedWindow('image')
    cv2.setMouseCallback('image', OnMouseAction)
    position1 = None
    position2 = None
    x0, yo = None, None
    cnt = None
    while True:
        # 获取视频的一帧
        ret, frame = video_capture.read()

        # 转换为灰度图像
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # 检测人体
        bodies = cascade_classifier.detectMultiScale(gray, 1.1, 4)

        # 在图像上绘制人体框并显示
        for (x, y, w, h) in bodies:
            cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

        if ret:
            if position1 != None and position2 != None:
                cv2.rectangle(frame, position1, position2, (0, 0, 255), 1, 4)

        cv2.imshow('image', frame)

        # 按'q'键退出
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    # 释放资源
    video_capture.release()
    cv2.destroyAllWindows()
  • 计算行人中心点并判断中心点是否在矩形区域内,这里设置到我们初中学习的一个数字知识点,中心点的计算公式:x0,y0 = (x1+x2)/2,(y1+y2)/2,其次通过pointPolygonTest方法判断中心点是否在指定区域内。
import cv2
import numpy as np

# 鼠标事件
def OnMouseAction(event, x, y, flags, param):
    global position1, position2
    if event == cv2.EVENT_LBUTTONDOWN:  # 按下左键
        position1 = (x, y)
        position2 = None

    elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:  # 按住左键拖曳不放开
        position2 = (x, y)

    elif event == cv2.EVENT_LBUTTONUP:  # 放开左键q
        position2 = (x, y)

if __name__ == '__main__':
    # 加载Haar级联分类器模型
    cascade_classifier = cv2.CascadeClassifier('./model/haarcascade_fullbody.xml')

    # 加载视频
    video_capture = cv2.VideoCapture('./data/test.mp4')
    cv2.namedWindow('image')
    cv2.setMouseCallback('image', OnMouseAction)
    position1 = None
    position2 = None
    x0, yo = None, None
    cnt = None
    while True:
        # 获取视频的一帧
        ret, frame = video_capture.read()

        # 转换为灰度图像
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        # 检测人体
        bodies = cascade_classifier.detectMultiScale(gray, 1.1, 4)

        # 在图像上绘制人体框并显示
        for (x, y, w, h) in bodies:
            cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

        if ret:
            if position1 != None and position2 != None:
               
                cv2.rectangle(frame, position1, position2, (0, 0, 255), 1, 4)
                for (x, y, w, h) in bodies:
                    x0, yo = int((x + x + w) / 2), int((y + y + h) / 2)
                    if cv2.pointPolygonTest(cnt, (x0, yo), False) >= 0:
                        cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)

        cv2.imshow('image', frame)

        # 按'q'键退出
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    # 释放资源
    video_capture.release()
    cv2.destroyAllWindows()

3、项目结构

pythonopencv检测行人,OpenCv,opencv,python,计算机视觉

 4、总结

        上述只是做了一个基础案例,该案例依然存在以下几点小的问题,第一点问题就是效率问题,针对视频流的处理是非常消耗内存的如果电脑是cpu的话,所以针对这个问题我查阅了一下资料,使用numba可以提升对视频流处理速度。第二点问题是行人识别准确度问题,当前使用Haar的识别器效果还是不好的,我们可以使用yolov5或者MobileNet-SSD模型对行人进行识别效果会更佳,第三个问题是绘制区域的优化,目前是默认矩形区域,实际形形况中可能是非矩形的多边形区域,所以针对这个需要进一步的优化。以上就是今天的案例分享,如果对大家有帮助可以点个赞奥~♥♥

百度网盘 请输入提取码 文章来源地址https://www.toymoban.com/news/detail-703900.html

到了这里,关于python使用opencv实现识别指定区域的行人的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 识别红色区域(python+opencv)

    版本: Python:3.7 OpenCV: 4.5.5 步骤: 1、将图片转到HSV色彩空间; 2、设定H、S、V三值的范围;         参考链接:OpenCV中HSV颜色模型及颜色分量范围 - wangyblzu - 博客园         注:红色的H有俩个范围(0-10和156-180) 3、使用OpenCV中inRange()函数将输入的HSV图筛选出符合上述

    2024年02月05日
    浏览(72)
  • 基于OpenCV实现对图片及视频中感兴趣区域颜色识别

    学习路线指引(点击解锁) 知识定位 人群定位 🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量

    2023年04月09日
    浏览(62)
  • 【opencv】传统图像识别:hog+svm行人识别实战

    实战工具:python3.7+pycharm+opencv4.6 算法知识:HOG特征提取、SVM模型构建 实战目的:本次实战的目的是熟悉HOG+SVM工作流算法,初步掌握图像分类的传统算法。 实战记录:本以为在学习原理、算法应用、动手实操后会很顺利的完全自主实现行人检测项目,但实战过程却差强人意,

    2024年02月13日
    浏览(41)
  • Python实现指定区域桌面变化监控并报警

    在这篇博客中,我们将使用Python编程语言和一些常用的库来实现一个简单的区域监控和变化报警系统。我们将使用Tkinter库创建一个图形界面,允许用户选择监控区域,并使用OpenCV库进行图像处理和相似性比较,以检测区域内的变化,并通过播放声音进行报警。 实现效果 运行

    2024年02月15日
    浏览(58)
  • 使用Python和OpenCV实现身份证识别

    Python是一种功能强大的编程语言,可以用于各种各样的应用场景,包括身份证识别。在本文中,我们将介绍如何使用Python来识别身份证,并提供一个示例代码来演示这个过程。 身份证是中国公民的重要证件,包含了个人的基本信息,如姓名、性别、出生日期、民族、住址等。

    2024年02月16日
    浏览(47)
  • python 实现excel表选中区域数据转置并存入另一个excel指定的区域中方法

    import pandas as pd from openpyxl import load_workbook def qyhhsj(source_file,source_sheetname,source_col,source_start_row,source_end_row,source_start_col,source_end_col,target_file,target_sheetname,target_start_row,target_end_row,target_start_col,target_end_col):     \\\"\\\"\\\"     source_file  数据源表格所在的路径     source_sheetname   数据源表

    2024年02月16日
    浏览(47)
  • 使用MediaPipe和OpenCV的Python实现手势识别

    手势识别技术是一种非常有用的技术,它可以将人类的手势转化为计算机可以理解的形式,从而实现更加自然、快速和直观的交互方式。本文将介绍一种基于MediaPipe和OpenCV的手势识别技术,可以实现对手势的实时识别和分析。 MediaPipe是一种开源的机器学习框架,可以用于构建

    2024年02月14日
    浏览(48)
  • opencv报错cv2.error: OpenCV(4.8.0) D:aopencv-pythonopencv-pythonopencvmodulescoresrcalloc.cpp:

    opencv报错: 这个错误通常表示你的计算机内存不足,导致OpenCV无法分配需要的内存。解决此问题的方法如下: 增加计算机内存:如果你的计算机内存过小,可以考虑增加内存来解决该问题。 释放不需要的内存:在运行大型程序时,你可以尝试释放一些不需要的内存,如关闭

    2024年02月21日
    浏览(42)
  • vue-element使用html2canvas实现网页指定区域(指定dom元素)截图

    直接上代码: ** 如果要截取的dom元素、区域涉及到v-if或者v-show的条件表达式时,截取的方法请在nextTick里面调用----例如: this.$nextTick(() = { this.saveImageNew() }) 否之获取dom元素的时候会获取不到!!!!!!!!

    2024年02月04日
    浏览(66)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包