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

news2024/11/18 13:55:40
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 img


def 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 thresholdimg


def 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, -1

    for i in range(len(blocks)):
        b = orgimg[blocks[i][0][1]:blocks[i][0][3], blocks[i][0][0]:blocks[i][0][2]]
        # RGB 转HSV
        hsv = 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 = 0
        for m in mask:
            w1 += m / 255

        w2 = 0
        for w in w1:
            w2 += w

        # 选出最大权值的区域
        if w2 > maxweight:
            maxindex = i
            maxweight = w2

    return 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 = 16
    h = w = r * 2 + 1
    kernel = 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, img


if __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_count
    else:
        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.coloradmin.cn/o/1417700.html

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

相关文章

全国客运飞机场数据,shp/excel格式,已可视化

基本信息. 数据名称: 全国客运飞机场数据 数据格式: Shpxlsx 数据时间: 2023年 数据几何类型: 点 数据坐标系: WGS84坐标系 数据来源:网络公开数据 数据字段: 序号字段名称字段说明1xzqhdm行政区划代码2xzqhmc行政区划名称3mc机场名称4lon经度坐…

【文本到上下文 #7】探索 NLP 中的 Seq2Seq、编码器-解码器和注意力机制

一、说明 今天,我们将探讨序列到序列 (seq2seq) 模型的复杂工作原理,特别关注编码器-解码器架构和注意力机制。这些概念是各种 NLP 应用的基础,从机器翻译到问答系统。 这是可以期待的: Seq2Seq模型中的编码…

小程序开发平台微同城本地生活服务小程序功能 带完整的安装以及部署教程

移动互联网的普及,小程序已经成为一种新的应用形态,为本地生活服务提供了更多的可能性。微同城作为一款本地生活服务小程序,致力于为当地居民提供便捷、高效的生活服务体验。罗峰给大家分享微同城本地生活服务小程序的源码开发背景以及系统的…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之CheckboxGroup组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之CheckboxGroup组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、CheckboxGroup组件 提供多选框组件,通常用于某选项的打开或关…

【数据分析】numpy基础第三天

前言 本文只会讲解最常用的加、减、乘、除,点乘(或叫矩阵乘法)、还有广播机制。 本文代码 链接提取码:1024 第1部分:基础数学计算 使用NumPy进行基本的数学运算是十分直观和简单的。下面我们将展示一些基本的加、…

机器学习第二十七周周报 PINNs

文章目录 week27 PINNs摘要Abstract一、监督学习二、文献阅读1. 题目2. abstract3. 偏微分方程的数据驱动解3.1连续时间模型example(Schrodinger equation): 3.2离散时间模型Example (Allen–Cahn equation): 4. 文献解读4.1 Introduction4.2 创新点 三、…

1.28寒假集训

A: 解题思路&#xff1a; 移项就好v mv / (M - m) 下面是c代码&#xff1a; #include<iostream> using namespace std; int main() {int t;double M,m,v;cin >> t;while(t ! 0){cin >> M >> m >> v;printf("%.2lf\n",(m * v) / (M…

【动态规划】【字符串】【行程码】1531. 压缩字符串

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 LeetCode 1531. 压缩字符串 II 行程长度编码 是一种常用的字符串压缩方法&#xff0c;它将连续的相同字符&#xff08;重复 2 次或更多次&#xff09;替换为字符和表示字符计数的数字&#xff08;行程长度&#xff09;…

WordPress如何自定义日期和时间格式?附PHP日期和时间格式字符串

WordPress网站在很多地方都需要用到日期和时间&#xff0c;那么我们应该在哪里设置日期和时间呢&#xff1f;又如何自定义日期和时间格式呢&#xff1f;下面boke112百科就跟大家一起来学习一下PHP标准化的日期和时间格式字符串。 特别说明&#xff1a;格式字符是标准化的&#…

Material Components for Android助你打造精美App

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

RT-DETR改进有效系列目录 | 包含卷积、主干、RepC3、注意力机制、Neck上百种创新机制

💡 RT-DETR改进有效系列目录 💡 前言 Hello,各位读者们好 Hello,各位读者,距离第一天发RT-DETR的博客已经过去了接近两个月,这段时间里我深入的研究了一下RT-DETR在ultralytics仓库的使用,旨在为大家解决为什么用v8的仓库训练的时候模型不收敛,精度差的离谱的问题,…

sqli.labs靶场(8-17关)

8、第八关&#xff08;布尔盲注&#xff09; id1显示You are in...........&#xff0c;id1单引号不显示&#xff0c;id1 --显示正常 这个应该是单引号闭合&#xff0c;接下来就和第七关差不多上脚本 爆库名长度&#xff1a;id1%27%20and%20length(database()){i}%20-- 爆库…

如何在 VM 虚拟机中安装 Red Hat Enterprise Linux 9.3 操作系统保姆级教程(附链接)

一、VMware Workstation 虚拟机 先得安装 VM 虚拟机&#xff0c;没有的可以参考这篇文章安装 VM 虚拟机 如何在 VM 虚拟机中安装 Win10 操作系统保姆级教程&#xff08;附链接&#xff09;https://eclecticism.blog.csdn.net/article/details/135713915 二、Red Hat Linux 镜…

软考 系统分析师系列知识点之知识管理(2)

接前一篇文章&#xff1a;软考 系统分析师系列知识点之知识管理&#xff08;1&#xff09; 所属章节&#xff1a; 第7章. 企业信息化战略与实施 第7节. 企业信息系统 7.7.5 知识管理 相关试题 1. 知识管理是企业信息化过程中的重要环节&#xff0c;知识可以分为显性知识和隐性…

计算机网络——IP协议

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

leetcode26. 删除有序数组中的重复项

题目 题目 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &…

前端——JavaScript

目录 文章目录 前言 一. JavaScript基础 1.JavaScript基本结构 2. JavaScript 执行过程 3. JavaScript 引入方式 二. JavaScript 语法 1.数据类型 2.变量 2.1 var 关键字定义变量 2.2 let 关键字定义变量 2.3 var 与 let 的区别 3.字符串 3.1定义字符串 3.2 字…

Python爬虫解析库安装

解析库的安装 抓取网页代码之后&#xff0c;下一步就是从网页中提取信息。提取信息的方式有多种多样&#xff0c;可以使用正则来提取&#xff0c;但是写起来相对比较烦琐。这里还有许多强大的解析库&#xff0c;如 lxml、Beautiful Soup、pyquery 等。此外&#xff0c;还提供了…

除了Adobe之外,还有什么方法可以将Excel转为PDF?

前言 Java是一种广泛使用的编程语言&#xff0c;它在企业级应用开发中发挥着重要作用。而在实际的开发过程中&#xff0c;我们常常需要处理各种数据格式转换的需求。今天小编为大家介绍下如何使用葡萄城公司的的Java API 组件GrapeCity Documents for Excel&#xff08;以下简…

数据结构(一)------顺序表

文章目录 前言一、什么是顺序表二、实现顺序表1.静态顺序表2.动态顺序表总结 前言 制作不易&#xff01;三连支持一下呗&#xff01;&#xff01;&#xff01; 从今天起我们将会进入数据结构的学习&#xff01; 我们先来了解 什么是数据结构 数据结构是计算机存储、组织数…