DeepSORT算法实现车辆和行人跟踪计数和是否道路违规检测(代码+教程)

DeepSORT算法是一种用于目标跟踪的算法,它可以对车辆和行人进行跟踪计数,并且可以检测是否存在道路违规行为。该算法采用深度学习技术来提取特征,并使用卡尔曼滤波器来估计物体的速度和位置。

DeepSORT算法通过首先使用目标检测算法来识别出场景中的车辆和行人,然后使用卷积神经网络(CNN)来提取物体的特征。接着,该算法使用余弦相似度来计算物体之间的相似度,并使用匈牙利算法来匹配跟踪器和检测器之间的物体。最后,DeepSORT算法使用卡尔曼滤波器来预测物体的位置和速度,并更新跟踪器状态。

除了可以进行目标跟踪计数外,DeepSORT算法还可以用于道路违规检测。例如,该算法可以检测车辆是否违规超速或跨越道路中心线等。此外,DeepSORT算法还可以应用于视频监控、智能交通和自动驾驶等领域。

总之,DeepSORT算法是一种用于目标跟踪的高效算法,它可以用于车辆和行人的跟踪计数,并且可以检测道路违规行为。在未来,该算法将会在各种领域中有广泛的应用价值。

特征提取

此处面对的场景是是交通摄像头下的马路场景,数据格式为视频流或者视频,所以我们要提取视频的第一帧作为背景来进行车道线的标定,运行extra.py文件即可提取第一帧背景图片。

 车道线和斑马线

根据第一步提取的场景背景图片,进行道路信息的标定,并返回道路信息的相关参数。
标定的方式是运行车道线标定文件即可。
先鼠标在背景图片上从左至右依次点击红色的两边的车道线实线,然后鼠标再依次在背景图片点击斑马线绿色框的从左至右四个顶点。这样就可以将斑马线和车道线的位置信息进行提取了,项目目录下会生成如上图标记好了的输出图片如上。

车牌识别


车牌号使用车牌号的识别是从车辆出现在画面的第一帧开始,一直到车辆消失在画面中。我们并不能事先确定在哪一帧对车牌的识别效果最好。因此,我们在车辆出现的第一帧,就将它的id和车牌信息传入字典chepaixinxi保存起来。如果当前帧比之前的识别效果都好(置信度高),我们就用它替换之前的车牌信息。另一方面,为了节省计算资源,只要是该车在某一帧的车牌置信度高于0.9,我们就不再将其传入车牌识别模块,运行LPR.py即可提取车牌信息,提取效果如下图所示

 

import cv2
import numpy as np
import math""" 输入图像归一化 """def stretch(img):max = float(img.max())min = float(img.min())for i in range(img.shape[0]):for j in range(img.shape[1]):img[i, j] = (255 / (max - min)) * img[i, j] - (255 * min) / (max - min)return imgdef dobinaryzation(img):max = float(img.max())min = float(img.min())x = max - ((max - min) / 2)ret, thresholdimg = cv2.threshold(img, x, 255, cv2.THRESH_BINARY)return thresholdimgdef find_retangle(contour):y, x = [], []for p in contour:y.append(p[0][0])x.append(p[0][1])return [min(y), min(x), max(y), max(x)]def locate_license(img, orgimg):img, contours, hierachy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)# 找到最大的三个区域blocks = []for c in contours:# 找出轮廓的左上和右下点,计算出其面积和长宽比r = find_retangle(c)a = (r[2] - r[0]) * (r[3] - r[1])s = (r[2] - r[0]) / (r[3] - r[1])blocks.append([r, a, s])# 选出面积最大的3个区域blocks = sorted(blocks, key=lambda b: b[2])[-3:]# 使用颜色识别判断出最像车牌的区域maxweight, maxinedx = 0, -1for i in range(len(blocks)):b = orgimg[blocks[i][0][1]:blocks[i][0][3], blocks[i][0][0]:blocks[i][0][2]]# RGB 转HSVhsv = cv2.cvtColor(b, cv2.COLOR_BGR2HSV)# 蓝色车牌范围lower = np.array([100, 50, 50])upper = np.array([140, 255, 255])# 根据阈值构建掩膜mask = cv2.inRange(hsv, lower, upper)# 统计权值w1 = 0for m in mask:w1 += m / 255w2 = 0for w in w1:w2 += w# 选出最大权值的区域if w2 > maxweight:maxindex = imaxweight = w2return blocks[maxindex][0]def find_license(img):'''预处理'''# 压缩图像a = 400 * img.shape[0] / img.shape[1]a = int(a)img = cv2.resize(img, (400, a))cv2.imshow('img',img)cv2.waitKey()# RGB转灰色grayimg = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)cv2.imshow('grayimg', grayimg)cv2.waitKey()# 灰度拉伸stretchedimg = stretch(grayimg)cv2.imshow('stretchedimg', stretchedimg)cv2.waitKey()# 进行开运算,用来去除噪声r = 16h = w = r * 2 + 1kernel = np.zeros((h, w), dtype=np.uint8)cv2.circle(kernel, (r, r), r, 1, -1)openingimg = cv2.morphologyEx(stretchedimg, cv2.MORPH_OPEN, kernel)cv2.imshow('openingimg', openingimg)cv2.waitKey()strtimg = cv2.absdiff(stretchedimg, openingimg)cv2.imshow('strtimg', strtimg)cv2.waitKey()# 图像二值化binaryimg = dobinaryzation(strtimg)cv2.imshow('binaryimg', binaryimg)cv2.waitKey()# Canny算子进行边缘检测cannyimg = cv2.Canny(binaryimg, binaryimg.shape[0], binaryimg.shape[1])cv2.imshow('cannyimg', cannyimg)cv2.waitKey()'''消除小区域,连通大区域'''# 进行闭运算kernel = np.ones((5, 19), np.uint8)closingimg = cv2.morphologyEx(cannyimg, cv2.MORPH_CLOSE, kernel)cv2.imshow('closingimg', closingimg)cv2.waitKey()# 进行开运算openingimg = cv2.morphologyEx(closingimg, cv2.MORPH_OPEN, kernel)cv2.imshow('openingimg', openingimg)cv2.waitKey()# 再次进行开运算kernel = np.ones((11, 5), np.uint8)openingimg = cv2.morphologyEx(openingimg, cv2.MORPH_OPEN, kernel)cv2.imshow('openingimg', openingimg)cv2.waitKey()# 消除小区域,定位车牌位置rect = locate_license(openingimg, img)return rect, imgif __name__ == '__main__':orgimg = cv2.imread('car3.jpg')rect, img = find_license(orgimg)cv2.rectangle(img, (rect[0], rect[1]), (rect[2], rect[3]), (0, 255, 0), 2)cv2.imshow('img', img)cv2.waitKey()cv2.destroyAllWindows()

 

车辆越实线、不礼让行人检测

我们将车辆在上一帧的检测位置保存下来。如果车辆在上一帧的位置和在这一帧的位置分别位于车道线实线的两侧,或者落在了实线上,我们就判定车辆非法越实线了。行人在斑马线上时,车辆也在斑马线上 ==>车辆不礼让行人,运行效果图:

# 生成感兴趣区域即Mask掩模
def region_of_interest(image, vertices):mask = np.zeros_like(image)  # 生成图像大小一致的zeros矩# 填充顶点vertices中间区域if len(image.shape) > 2:channel_count = image.shape[2]ignore_mask_color = (255,) * channel_countelse:ignore_mask_color = 255# 填充函数cv.fillPoly(mask, vertices, ignore_mask_color)masked_image = cv.bitwise_and(image, mask)return masked_image# 生成Mask掩模vertices = np.array([[(0, imshape[0]), (9 * imshape[1] / 20, 11 * imshape[0] / 18),(11 * imshape[1] / 20, 11 * imshape[0] / 18), (imshape[1], imshape[0])]], dtype=np.int32)masked_edges = region_of_interest(edge_image, vertices)

 私信会回复。

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

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

相关文章

1 月 27日算法练习-贪心

文章目录 扫地机器人分糖果最小战斗力差距谈判纪念品分组 扫地机器人 思路: 最优机器人清理方法:机器人清理方法先扫左边,有时间再扫右边。最短时间:通过枚举,从 1 开始,清理面积会越大直到全部面积的清理…

【Sql Server】新手一分钟看懂在已有表基础上增加字段和说明

欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对…

计算机网络——IP协议

前言 网络层的主要负责地址分配和路由选择,ip负责在网络中进行数据包的路由和传输。 IPv4报文组成(了解) IPv4首部:IPv4首部包含了用于路由和传输数据的控制信息,其长度为20个字节(固定长度)。 版本&#…

单片机14-17

目录 LCD1602 LCD1602液晶显示屏 直流电机驱动(PWM) LED呼吸灯 直流电机调速 AD/DA(SPI通信) AD模数转换 DA数模转换 红外遥控(外部中断) 红外遥控 红外遥控电机调速 LCD1602 LCD1602液晶显示屏 …

Web 开发 6:Redis 缓存(Flask项目使用Redis并同时部署到Docker详细流程 附项目源码)

大家好!欢迎来到第六篇 Web 开发教程,今天我们将探讨一个非常重要的话题:Redis 缓存。作为一个互联网开发者,你一定知道在处理大量请求时,性能优化是至关重要的。而 Redis 缓存正是帮助我们提升系统性能的利器。Redis …

四川古力未来科技公司抖音小店选品攻略从零到一

随着抖音的日益火爆,抖音小店也应运而生,成为了电商行业的新宠儿。但对于许多新手商家来说,如何从众多的商品中挑选出适合自己店铺的商品,却是一件非常头疼的事情。本文将为你揭秘抖音小店的选品攻略,让你轻松玩转电商…

A股风格因子看板 (2024.01 第10期)

该因子看板跟踪A股风格因子,该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子,用以分析市场风格切换、组合风格暴 露等。 今日为该因子跟踪第10期,指数组合数据截止日2023-12-31,要点如下 近1年A股风格因子检验…

网络安全面试你应该准备什么?

年底,刚过了校招和跳槽的密集阶段,有的同学拿到了心仪的Offer,有的同学却铩羽而归。星球里也有小伙伴提出了这样的问题:安全相关的工作,有没有什么面试技巧呢? 由于安全门类巨大,涉及的技术很多…

Python进阶(1) | 使用VScode写单元测试

Python进阶(1) | 单元测试 2024.01.28 VSCode: 1.85.1 Linux(ubuntu 22.04) 文章目录 Python进阶(1) | 单元测试1. 目的2. Python Profile3. 单元测试框架3.1 什么是单元测试3.2 选一个单元测试框架3.3 编写 Python 单元测试代码3.4 在 VSCode 里发现单元测试3.5 再写一个单元…

【MySQL】补充和navicat的一些简单使用

文章目录 前言在这里插入图片描述 事情起因因为这个articlecount的c是小写了,我想改成大写 一、修改二、navicat的使用步骤1.连接2.建库,建表 三.填写数据总结 前言 事情起因因为这个articlecount的c是小写了,我想改成大写 提示:…

Redis 学习笔记 2:Java 客户端

Redis 学习笔记 2:Java 客户端 常见的 Redis Java 客户端有三种: Jedis,优点是API 风格与 Redis 命令命名保持一致,容易上手,缺点是连接实例是线程不安全的,多线程场景需要用线程池来管理连接。Redisson&…

一文搞懂设计模式—策略模式

本文已收录至Github,推荐阅读 👉 Java随想录 微信公众号:Java随想录 文章目录 使用场景策略模式实现策略模式的优缺点策略模式优化使用Map取消 Context 类策略枚举解决策略类膨胀SpringBoot中的策略模式 总结 在软件开发中,经常会…

pcl应用八叉树实例

pcl应用八叉树实例 文章目录 pcl应用八叉树实例1、基本概念2、基于八叉树的空间划分及搜索操作2.1、关键函数说明2.1.2 OctreePointCloudSearch 类2.1.2 voxelSearch 函数 3、无序点云数据集的空间变化检测 1、基本概念 八叉树结构通过循环递归的划分方法对大小为2 n ∗ 2 n ∗…

C++面试宝典第25题:阶乘末尾零的个数

题目 给定一个整数n,返回n!(n的阶乘)结果尾数中零的个数。 示例 1: 输入:3 输出:0 解释:3! = 6,尾数中没有零。 示例 2: 输入:5 输出:1 解释:5! = 120,尾数中有1个零。 解析 这道题主要考察应聘者对于数学问题的分析和理解能力,以及在多个解决方案中,寻求最优…

elementUI的el-select传递item对象或其他参数的2种方法

方法1 :value“item” 绑定对象 只要:value绑定item对象就可以 value-key"value" 必须是item里的一个属性&#xff0c;绑定值为对象类型时必填 <el-select v-model"value" placeholder"请选择" value-key"value" change"cha…

(蓝桥杯每日一题)求最长回文串

问题描述 给出一个长度为 n 的小写字符串&#xff0c;求一个最长的子串 S&#xff0c;满足SXY,X&#xff0c;Y>1&#xff0c;且X,Y 均为回文串。 输入格式 输入包括一行: 第一行是一个长度为 n 的小写字符串。 输出格式 输出包括一行&#xff1a; 一行一个整数&#xff0c;表…

Material Components for Android助你打造精美App

Material Components for Android助你打造精美App 简介 Material Components for Android (MDC-Android) 是帮助开发者执行 Material Design 的工具。由谷歌的核心工程师和用户体验设计师团队开发&#xff0c;这些组件使得开发者可以可靠地开发工作流来构建美观且功能齐全的 …

期权定价模型系列[9]SABR模型

1.简介 SABR模型是由 Hagan在 2002年提出的一种随机波动率模型&#xff0c;在抛弃了原始的BSM 模型中对于波动率为某一常数的假定&#xff0c;假设隐含波动率同样是符合几何布朗运动的&#xff0c;并且将隐含波动率设定为标的价格和合约行权价的函数&#xff0c;结合了隐含波动…

12.5内存操作流(血干JAVA系列)

12.5内存操作流 12.5内存操作流ByteArraylnputStream类的主要方法ByteArrayOutputStream 类的主要方法【例12.33】使用内存操作流完成一个大写字母转换为小写字母的程序 12.5内存操作流 在 流 的 操 作 中 除 了 进 行 文 件 的 输 入 与 输 出 操 作 之 外 &#xff0c; 也 可…

flask初体验

1、定义 Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务。 中文官网 2、初步上手 1、安装flask pip3 install flask 2、创建flask应用 # -*- coding = utf-8 -*- # @Time : 2024/1/28 23:02 # @Author: Frank # @File: main.py…