打卡软件——人脸识别综合实现Pro

目录

概要

代码说明

1. 导入库

2. 加载预训练的车辆检测模型

3. 读取视频

4. 初始化变量

5. 逐帧处理视频

6. 处理帧

7. 处理检测结果

8. 计算框的坐标

9. 检查车辆中心是否已计数

10. 绘制检测框

11. 显示车流量

12. 退出条件

13. 释放资源

整体代码

效果展示

可拓展的地方

总结


概要

        实时车辆检测和计数,利用 YOLO 模型的快速检测能力,通过距离阈值来减少重复计数的问题。代码结构清晰,易于理解,并为后续功能扩展(如目标跟踪)提供了基础。

代码说明

1. 导入库

 
import cv2
import numpy as np

  • cv2 是 OpenCV 库,用于计算机视觉任务。
  • numpy 是一个用于处理数组和矩阵的库,特别适合进行数值计算。

2. 加载预训练的车辆检测模型

 
net = cv2.dnn.readNet("../needFiles/yolov3.weights", "../needFiles/yolov3.cfg")
layer_names = net.getLayerNames()
output_layers = [layer_names[i - 1] for i in net.getUnconnectedOutLayers()]

  • cv2.dnn.readNet 加载 YOLO 模型的权重和配置文件。
  • getLayerNames 获取模型的所有层的名称。
  • getUnconnectedOutLayers 返回未连接的输出层的索引,并用这些索引生成 output_layers 列表。

3. 读取视频

 
cap = cv2.VideoCapture("./videos/test1.mp4")

  • 使用 cv2.VideoCapture 打开视频文件,准备逐帧读取。

4. 初始化变量

 
car_count = 0
detected_centers = []  # 用于存储已检测车辆的中心位置
distance_threshold = 50  # 设置距离阈值

  • car_count 用于统计检测到的车辆数量。
  • detected_centers 列表存储已检测车辆的中心位置,以避免重复计数。
  • distance_threshold 设置检测车辆中心位置的距离阈值。

5. 逐帧处理视频

 
while cap.isOpened():ret, frame = cap.read()if not ret:break

  • 使用 while 循环逐帧读取视频。
  • cap.read() 返回布尔值 ret 和当前帧 frame,当读取完成时,跳出循环。

6. 处理帧

 
height, width, _ = frame.shape
blob = cv2.dnn.blobFromImage(frame, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
net.setInput(blob)
outputs = net.forward(output_layers)

  • 获取当前帧的高度和宽度。
  • cv2.dnn.blobFromImage 将帧转换为模型可以处理的 blob 格式。
  • setInput 设置输入层。
  • forward 方法执行前向传播,获取检测结果。

7. 处理检测结果

 
for output in outputs:for detection in output:scores = detection[5:]class_id = np.argmax(scores)confidence = scores[class_id]if confidence > 0.5:  # 置信度阈值

  • 遍历模型的输出结果。
  • 提取每个检测结果的置信度分数,并找到最大置信度对应的类别。
  • 设置置信度阈值(0.5),只处理高置信度的检测。

8. 计算框的坐标

 
center_x = int(detection[0] * width)
center_y = int(detection[1] * height)
w = int(detection[2] * width)
h = int(detection[3] * height)

  • 计算检测框的中心坐标和宽高,归一化的值需要乘以帧的宽度和高度。

9. 检查车辆中心是否已计数

 
if all(np.linalg.norm(np.array(center) - np.array(dc)) > distance_threshold for dc in detected_centers):detected_centers.append(center)  # 添加到已检测集合car_count += 1  # 计数

  • 使用距离计算,确保新检测的车辆中心位置与已检测车辆的中心之间的距离大于阈值。
  • 如果符合条件,则将新中心添加到 detected_centers 并增加计数。

10. 绘制检测框

 
cv2.rectangle(frame, (center_x - w // 2, center_y - h // 2),(center_x + w // 2, center_y + h // 2), (0, 255, 0), 2)

  • 使用 cv2.rectangle 在检测到的车辆周围绘制绿色矩形框。

11. 显示车流量

 
cv2.putText(frame, f"Car Count: {car_count}", (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
cv2.imshow("Video", frame)

  • 在视频帧上绘制当前车辆计数的文本。
  • 使用 cv2.imshow 显示处理后的帧。

12. 退出条件

 
if cv2.waitKey(1) & 0xFF == ord('q'):break

  • 等待按键,如果按下 'q' 则退出循环。

13. 释放资源

 
cap.release()
cv2.destroyAllWindows()

  • 释放视频捕捉对象并关闭所有 OpenCV 窗口。

整体代码

import cv2
import numpy as np# 加载预训练的车辆检测模型
net = cv2.dnn.readNet("../needFiles/yolov3.weights", "../needFiles/yolov3.cfg")
layer_names = net.getLayerNames()
output_layers = [layer_names[i - 1] for i in net.getUnconnectedOutLayers()]# 读取视频
cap = cv2.VideoCapture("./videos/test1.mp4")# 车流量计数
car_count = 0
detected_centers = []  # 用于存储已检测车辆的中心位置
distance_threshold = 50  # 设置距离阈值while cap.isOpened():ret, frame = cap.read()if not ret:break# 处理帧height, width, _ = frame.shapeblob = cv2.dnn.blobFromImage(frame, 0.00392, (416, 416), (0, 0, 0), True, crop=False)net.setInput(blob)outputs = net.forward(output_layers)# 处理检测结果for output in outputs:for detection in output:scores = detection[5:]class_id = np.argmax(scores)confidence = scores[class_id]if confidence > 0.5:  # 置信度阈值# 计算框的坐标center_x = int(detection[0] * width)center_y = int(detection[1] * height)w = int(detection[2] * width)h = int(detection[3] * height)center = (center_x, center_y)# 检查车辆中心是否已经被计数# 判断与已检测车辆的距离if all(np.linalg.norm(np.array(center) - np.array(dc)) > distance_threshold for dc in detected_centers):detected_centers.append(center)  # 添加到已检测集合car_count += 1  # 计数# 画框cv2.rectangle(frame, (center_x - w // 2, center_y - h // 2),(center_x + w // 2, center_y + h // 2), (0, 255, 0), 2)# 显示当前车流量cv2.putText(frame, f"Car Count: {car_count}", (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)cv2.imshow("Video", frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()

效果展示

车流效果展示

可拓展的地方

  • 目标跟踪

    • 使用目标跟踪算法(如 SORT 或 Deep SORT)来持续跟踪车辆,避免在视频中重复计数。
  • 检测其他对象

    • 扩展模型以检测其他对象(如行人、摩托车等),并相应地更新计数。
  • 统计功能

    • 实现更详细的统计信息,如不同类型车辆的计数、车速估算等。
  • 数据记录与分析

    • 将检测结果和车辆信息存储到文件或数据库中,以便后续分析和可视化。
  • 实时警报

    • 根据特定条件(如车流量过高)触发警报或通知。
  • 可视化优化

    • 优化界面显示,例如添加图表展示车流量变化、使用不同颜色区分不同类型车辆等。
  • 用户界面

    • 创建一个图形用户界面(GUI),让用户能够选择视频文件、设置参数、查看统计信息。
  • 多摄像头支持

    • 扩展系统以支持多摄像头输入,整合不同角度的车流数据。
  • 深度学习模型更新

    • 集成自定义训练的模型,以提高特定场景下的检测准确率。
  • 环境适应

    • 增加对不同光照和天气条件下的自适应处理能力,提高鲁棒性。

总结

        我不爱总结。。。。开玩笑的,但我不总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/432311.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

过敏星人能否好好呼吸?约克VRF中央空调从呼吸开始全方位守护

对于包括向先生在内的过敏人群来说,秋天可能是比春天更难熬的坎儿,防不胜防的过敏原,例如空气中飘散的花粉、螨虫、霉菌、宠物毛发和皮屑、屋尘等,因为空气质量问题频频引发的过敏症状,令他们苦不堪言,止不住地打喷嚏、眼睛越揉越痒、起床后就开始擦鼻涕…… 如何才能远离这些…

免费的高质量、美观的甘特图模板

呈现您的项目规划新高度,精选几款高品质、视觉出众的甘特图模板。 甘特图Excel模板-Ganttable系统风格甘特图Excel模板-专业甘特图Excel模板-浅蓝色甘特图Excel模板-深灰色 这些 Excel 甘特图模板均源自 Ganttable 甘特图AI工具的智能生成与导出。利用 Ganttable&a…

Win32动态库介绍及全局函数导出

Windows操作系统中,库分为动态链接库(dll)和静态链接库(lib) 动态库是Windows中实现代码共享的一种方式。它是一个二进制式文件,不可单独运行,需要调用方调用才能运行。在Windows中,动态库可以被多种编程语言所支持。 静态链接库不…

线下线上陪玩系统要多少钱?该怎么搭建?

关于线下线上陪玩系统的价格,由于开发成本、功能复杂度、系统规模以及定制需求等因素的不同,价格差异较大,一般在几千元至几万元不等。具体价格需要根据实际需求和预算进行商议和定制。 搭建线下线上陪玩系统大致可以分为以下几个步骤&#…

论文阅读- On the Feasibility of Fully AI-automated Vishing Attacks

https://arxiv.org/pdf/2409.13793 目录 摘要 INTRODUCTION II. GOALS AND THREAT MODEL III. VIKING A. Architecture B. Interaction with the LLM C. Audio processing D. Call processing E. Implementation IV. EVALUATION METHODOLOGY A. Experiment design …

外卖霸王餐在对接api过程中需要注意哪些方面的问题?

在对接外卖霸王餐 API 过程中,需要注意以下几个方面: 一、合法性与合规性 1.遵守法律法规: 确保你的业务和对 API 的使用符合当地的法律法规,包括消费者权益保护法、电子商务法等。了解并遵守与食品相关的法律法规,…

后台数据管理系统 - 项目架构设计-Vue3+axios+Element-plus(0926)

十四、文章分类添加编辑 [element-plus 弹层] Git仓库&#xff1a;https://gitee.com/msyycn/vue3-hei-ma.git 点击显示弹层 准备弹层 const dialogVisible ref(false)<el-dialog v-model"dialogVisible" title"添加弹层" width"30%">…

【React】组件通信

1. 组件通信 组件间的数据传递 1.1 父传子 步骤&#xff1a; 父组件传递数据——在子组件标签上绑定属性子组件接收数据——子组件通过props参数接收数据 function Son(props) {return <div>{props.value}</div> }function App() {const value 父组件传给子…

从零开学C++:二叉搜索树

引言&#xff1a;在本篇博客当中&#xff0c;我们会将关于二叉树的进阶结构——二叉搜索树&#xff0c;强大的搜索效率让它在数据结构当中变得十分重要&#xff0c;让我们一起来进行学习吧&#xff01; 更多有关C的知识详解可前往个人主页&#xff1a;计信猫 一&#xff0c;二叉…

无人机避障——4D 毫米波雷达 SLAM篇(一)

做无人机避障相关工作&#xff0c;3D毫米波避障测试顺利后&#xff0c;开始做4D毫米波雷达无人机避障遇到4D雷达点云需要进行处理的问题&#xff0c;查阅文献&#xff0c;发现以下这篇文章中的建图方法应该为后续思考的方向&#xff0c;特此将这个开源项目进行复现和学习&#…

《论分布式存储系统架构设计》写作框架,软考高级系统架构设计师

论文真题 分布式存储系统&#xff08;Distributed Storage System&#xff09;通常将数据分散存储在多台独立的设备上。传统的网络存储系统采用集中的存储服务器存放所有数据&#xff0c;存储服务器成为系统性能的瓶颈&#xff0c;也是可靠性和安全性的焦点&#xff0c;不能满…

vue3.0 + element plus 全局自定义指令:select滚动分页

需求&#xff1a;项目里面下拉框数据较多 &#xff0c;一次性请求数据&#xff0c;体验差&#xff0c;效果就是滚动进行分页。 看到这个需求的时候&#xff0c;我第一反应就是封装成自定义指令&#xff0c;这样回头用的时候&#xff0c;直接调用就可以了。 第一步 第二步&…

双十一好物清单分享?五款超值的数码好物分享!

双十一马上就来啦&#xff0c;大家是不是都等着在这个时候买点好东西呀&#xff1f;数码产品可是咱们生活里少不了的&#xff0c;能让咱们的生活更方便、更有意思。我这儿给大家挑了五款特别值的数码好东西&#xff0c;准备来跟大家分享分享&#xff01;快来看看有没有你中意的…

【JAVA基础】JAVA类的拷贝使用示例

文章目录 一、框架介绍二、性能对比三、易用性对比四、使用示例&#xff08;一&#xff09;Apache Commons BeanUtils 使用例子1、第一个例子&#xff1a;两个对象属性个数和名称一样&#xff0c;复制过程2、第二个例子&#xff1a;属性个数和名称不一样&#xff0c;复制过程 &…

UnityHub下载任意版本的Unity包

1)先打开 // 也可以采用2直接打开 2)也可以直接打开 下载存档 (unity.com) 3)关联起来UnityHub即可

Mora:多智能体框架实现通用视频生成

人工智能咨询培训老师叶梓 转载标明出处 尽管已有一些模型能够生成视频&#xff0c;但大多数模型在生成超过10秒的长视频方面存在局限。Sora模型的出现标志着视频生成能力的一个新时代&#xff0c;它不仅能够根据文本提示生成长达一分钟的详细视频&#xff0c;而且在编辑、连接…

【CSS】定位

static ( 默认 )relative ( 相对定位 )absolute ( 绝对定位 )fixed ( 固定定位 )sticky ( 粘性定位 ) 普通文档流&#xff1f;浮动也会让元素脱离文档流&#xff0c;如果不设置浮动所有元素都处于普通文档流中。普通文档流中元素框的位置由元素在HTML中的位置决定&#xff0c;块…

Redisson分布式锁的概念和使用

Redisson分布式锁的概念和使用 一 简介1.1 什么是分布式锁&#xff1f;1.2 Redisson分布式锁的原理1.3 Redisson分布式锁的优势1.4 Redisson分布式锁的应用场景 二 案例2.1 锁竞争案例2.2 看门狗案例2.3 参考文章 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff…

文献阅读——基于拉格朗日乘子的电力系统安全域边界通用搜索方法

摘要 为提升电力系统安全域(security region&#xff0c;SR)的构建效 率&#xff0c;提出一种基于拉格朗日乘子(Lagrange multiplier&#xff0c;LM) 的电力系统安全域边界(security region boundary&#xff0c;SRB)通用搜索方法。 首先&#xff0c;根据电力系统静态安全性问…

2024.9.25 数据分析学习

资料&#xff1a; 【开课吧哩堂】数据挖掘项目之用户流失预警系统_哔哩哔哩_bilibili 五万字 | Spark吐血整理&#xff0c;学习与面试收藏这篇就够了&#xff01;-腾讯云开发者社区-腾讯云 (tencent.com) 黑马程序员Spark全套视频教程&#xff0c;4天spark3.2快速入门到精通…