基于OpenCV+YOLOv5实现车辆跟踪与计数(附源码)

导  读

    本文主要介绍基于OpenCV+YOLOv5实现车辆跟踪与计数的应用,并给出源码。

资源下载

    基础代码和视频下载地址:

https://github.com/freedomwebtech/win11vehiclecount

图片

main.py代码:​​​​​​​

import cv2import torchimport numpy as npfrom tracker import *model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
cap=cv2.VideoCapture('highway.mp4')
count=0tracker = Tracker()def POINTS(event, x, y, flags, param):    if event == cv2.EVENT_MOUSEMOVE :          colorsBGR = [x, y]        print(colorsBGR)        
cv2.namedWindow('FRAME')cv2.setMouseCallback('FRAME', POINTS)
while True:    ret,frame=cap.read()    if not ret:        break    count += 1    if count % 3 != 0:        continue    frame=cv2.resize(frame,(1020,600))    results=model(frame)    results.pandas().xyxy[0]                       cv2.imshow("FRAME",frame)    if cv2.waitKey(0)&0xFF==27:        breakcap.release()cv2.destroyAllWindows()

tracker.py代码:​​​​​​​

import mathclass Tracker:    def __init__(self):        # Store the center positions of the objects        self.center_points = {}        # Keep the count of the IDs        # each time a new object id detected, the count will increase by one        self.id_count = 0    def update(self, objects_rect):        # Objects boxes and ids        objects_bbs_ids = []
        # Get center point of new object        for rect in objects_rect:            x, y, w, h = rect            cx = (x + x + w) // 2            cy = (y + y + h) // 2
            # Find out if that object was detected already            same_object_detected = False            for id, pt in self.center_points.items():                dist = math.hypot(cx - pt[0], cy - pt[1])
                if dist < 35:                    self.center_points[id] = (cx, cy)#                    print(self.center_points)                    objects_bbs_ids.append([x, y, w, h, id])                    same_object_detected = True                    break
            # New object is detected we assign the ID to that object            if same_object_detected is False:                self.center_points[self.id_count] = (cx, cy)                objects_bbs_ids.append([x, y, w, h, self.id_count])                self.id_count += 1
        # Clean the dictionary by center points to remove IDS not used anymore        new_center_points = {}        for obj_bb_id in objects_bbs_ids:            _, _, _, _, object_id = obj_bb_id            center = self.center_points[object_id]            new_center_points[object_id] = center
        # Update dictionary with IDs not used removed        self.center_points = new_center_points.copy()        return objects_bbs_ids

    下载测试视频highway.mp4(download.txt中有链接):

图片

    安装ultralytics:

pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple

图片

      

实现车辆检测

    添加代码查看YoloV5模型检测输出信息:

图片

图片

    添加车辆检测结果绘制:

图片

图片

      

实现车辆跟踪

    将车辆矩形坐标保存到list中:

图片

    添加对象跟踪:

图片

图片

    车辆跟踪效果:

图片

图片

      

实现车辆计数

【1】划定一个多边形区域(黄色),车辆经过此区域则计数;

cv2.polylines(frame,[np.array(areal,np.int32)],True,(0,255,255),3)

【2】绿色点标注车辆矩形框右下角坐标点,如下图:

cv2.circle(frame,(x3,y3),4,(0,255,0),-1)

图片

【3】计数原理:判断绿色点是否在黄色四边形内,如果在内计数+1

图片

图片

计算点到多边形的距离使用的是OpenCV中pointPolygonTest函数:

图片

当result > 0表示点在轮廓内,也就是车辆在多边形内。此时将车辆id编号添加到集合area_1中,然后通过len(area_1)作为车辆计数值。

注意:这里为什么不直接用count += 1来计算数量?如果用count += 1会造成很多重复计数,而代码中利用了python集合的特性,add函数添加元素时,如果元素已经存在,则不重复添加,有效的避免了重复计数问题。

最终效果如下:

图片

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

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

相关文章

spring Cloud在代码中如何应用,erueka 客户端配置 和 服务端配置,Feign 和 Hystrix做高可用配置

文章目录 Eureka一、erueka 客户端配置二、eureka 服务端配置 三、高可用配置FeignHystrix 通过这篇文章来看看spring Cloud在代码中的具体应用&#xff0c;以及配置和注解&#xff1b; Eureka 一、erueka 客户端配置 1、Eureka 启禁用 eureka.client.enabledtrue 2、Eurek…

Android修行手册-ViewPager定制页面切换以及实现原理剖析

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

基于Springboot的墙绘产品展示交易平台(有报告),Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的墙绘产品展示交易平台&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff0…

基于DSP/SOC音乐灯效系统设计方法

音乐灯效系统设计方法 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,+群赠送语音信号处理降噪算法,蓝牙耳机音频,DSP音频项目核心开发资料, 三种方法: (1)MIC 采集音乐信号变化,(2)直接获取SPK 模拟音频…

20231127让RK3399的挖掘机开发板在Andorid12系统下休眠唤醒之后禁止锁屏

20231127让RK3399的挖掘机开发板在Andorid12系统下休眠唤醒之后禁止锁屏 2023/11/27 20:55 适用于SOC以及系统版本&#xff1a; RK3399&#xff1a;Android10/11/12 RK3568&#xff1a;Android11/12 RK3588&#xff1a;Android12 当RK3399平台的Android12系统在休眠之后&#x…

笔记62:注意力汇聚 --- Nadaraya_Watson 核回归

本地笔记地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_个人笔记\3.循环神经网络\第10章&#xff1a;动手学深度学习~注意力机制 a a a a a a a a a a a a a a a a

Vue简单的表单操作

效果预览图 完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>作业</title><styl…

<Linux> 文件理解与操作

目录 前言&#xff1a; 一、关于文件的预备知识 二、C语言文件操作 1. fope 2. fclose 3. 文件写入 3.1 fprintf 3.2 snprintf 三、系统文件操作 1. open 2. close 3. write 4. read 四、C文件接口与系统文件IO的关系 五、文件描述符 1. 理解文件描述符 2. 文…

P22 C++数组

目录 前言 01 什么是数组 02 如何定义数组 2.1 那么如何设置和访问这些整数呢&#xff1f; 2.2 小心内存越界 2.3 for循环遍历数组 03 在堆上创建数组 前言 本期我们讨论 C 中的数组。 在我们开始讨论数组之前&#xff0c;要先理解指针是什么&#xff0c;因为指针基本上…

饺子馆外卖点餐系统小程序效果如何

餐饮行业所涵盖的细分类目非常广&#xff0c;同时又是经济发展的重要支撑&#xff0c;市场规模非常高。饺子是很多人非常喜欢吃的食物&#xff0c;尤其过年的时候&#xff0c;必是少不了几碗饺子&#xff0c;平时也有大量人前往饺子馆。 但相对比火锅、炒菜馆则少些竞争力&…

数据结构——动态规划

动态规划&#xff1a;有很多重叠子问题&#xff0c;每一个状态一定是由上一个状态推导出来的 贪心&#xff1a;没有状态推导&#xff0c;而是从局部直接选最优的 动规五步曲&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 确定递推公式&#xff08;容…

【差旅游记】新疆哈密回王府印象

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 2023年11月4号&#xff0c;那天的风的确挺大&#xff0c;逛完哈密博物馆考虑要不要去旁边的哈密回王府逛逛。想着来都来了&#xff0c;虽然网上评价不太好&#xff0c;还是去溜达一圈吧&#xff0c;于是决定自己去转转…