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 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)

企鹅耗子:767172261

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Kubernetes的微服务架构,你学废了吗?

至于服务网关,虽然保留了 Zuul,但没有采用 Kubernetes 的 Ingress 来替代。这里有两个主要考虑因素:首先,Ingress Controller 并非 Kubernetes 的内置组件,有多种可选方案(例如 KONG、Nginx、Haproxy 等&am…

目标检测算法训练数据准备——Penn-Fudan数据集预处理实例说明(附代码)

目录 0. 前言 1. Penn-Fudan数据集介绍 2. Penn-Fudan数据集预处理过程 3. 结果展示 4. 完整代码 0. 前言 按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但是内容可能存在不准确的地方。如…

Springboot项目启动后浏览器不能直接访问接口,而postman可以访问?

在云服务器上部署springboot后端时,项目启动后浏览器不能直接访问接口,而postman可以访问。这是当时困扰了我大半天的小问题,在我打开防火墙和阿里云安全组之后还是没解决。然后在网上搜了很多很多资料,以为是浏览器访问权限或者是https什么证…

微信公众号数量达到上限怎么办

一般可以申请多少个公众号?许多用户在申请公众号时可能会遇到“公众号显示主体已达上限”的问题。这是因为在2018年11月16日对公众号申请数量进行了调整,具体调整如下:1、个人主体申请公众号数量上限从2个调整为1个。2、企业主体申请公众号数…

Mac删除自带的ABC输入法,简单快捷

一、下载PlistEdit Pro软件 二、终端执行 sudo open ~/Library/Preferences/com.apple.HIToolbox.plist 三、其中有一个数字下面的KeyboardLayout Name的value为“ABC”,这就是ABC输入法,点击上面的Delete按钮,删除整项ABC内容&#xff0c…

【计算机毕业设计】128电脑配件销售系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

public class和class的区别

不用public修饰的类 一个Java源文件中可以定义多个不用public修饰的class,且类名不用和java源文件名一致。public修饰的类可以没有。编译之后,一个class就会对应生成一个class字节码文件 对于用public修饰的类 如果一个类用了public修饰,那…

搞懂Nginx的.conf文件路径配置

详解server中各部分作用及如何配置 如下图所示,这是我配置好的一个server代码块,我这里配置了https,所以会比默认的多一部分内容,如果你只需要配置http,则只需关注红色方框的部分即可,下面会按顺序讲解。 ①…

C++进阶--继承

概念 继承,允许一个类(称为子类或派生类)从另一个类(称为父类或基类)继承属性和方法。 继承的主要目的是实现代码的重用和构建类之间的层次关系。通过继承,子类可以获得父类的特性,包括数据成员…

海外短剧系统国际短剧源码h5多语言版app挂载tiktok油管ins

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目 前言 一、海外短剧系统是什么? 二、海外短剧系统功能与运营方式介绍 1.系统功能 2.短剧APP运营方式 总结 前言 本文简单介绍海外短剧系统的功能&#xff…

【已解决】Ubuntu64位无法运行32位ELF文件的问题

问题起因 因为在做一道逆向题,发现题目给的文件是32位elf文件,所以想在Linux下执行一下,然后发现会报错。 于是查了一下资料,发现报错的原因是64位的Ubuntu无法直接运行32位的程序,需要下载兼容32位的库。 解决方法…

JUC并发编程10——ThreadLocal

目录 1. ThreadLocal是什么? 2. ThreadLocal怎么用? 3. ThreadLocal源码分析 3.1set方法 3.2get()方法 3.3remove()方法 4.为什么key使用弱引用? 5.ThreadLocalMap 和 HashMap 区别 6.ThreadLocal变量不具有传递性 7.InheritableTh…

Android 跳转应用设置/热点界面或等常用操作

Android 跳转应用设置/热点界面或等常用操作 https://www.jianshu.com/p/ba7164126690 android学习进阶——Setting https://blog.csdn.net/csdn_wanziooo/article/details/81980984 Android 7.1 以太网反射 EthernetManager 配置 DHCP、静态 IP https://codeleading.com/art…

防火墙综合拓扑(NAT、双机热备)

实验需求 拓扑 实验注意点: 先配置双机热备,再来配置安全策略和NAT两台双机热备的防火墙的接口号必须一致如果其中一台防火墙有过配置,最好清空或重启,不然配置会同步失败两台防火墙同步完成后,可以直接在主状态防火墙…

MyBatis 的注解实现方法

MyBatis 的注解实现方法 MyBatis 的注解实现方法引入依赖添加配置创建表创建实体类创建mapper接口InsertDeleteSelectResults和ResultMap通过配置文件解决 UpdateOptions MyBatis 的注解实现方法 引入依赖 在springBoot项目中下载了EditStarters插件的,可以直接在配置文件处右…

JVM学习

1.Java虚拟机内部有哪些线程共享,那些线程隔离 程序计数器: 通过改变这个计数器的值来选取下一条需要执行的字节码命令 Java虚拟机栈: 栈,每个方法被执行时,Java虚拟机都会同步的创建一个栈帧用于存储局部变量表&…

Linux:进度条的创建

目录 使用工具的简单介绍: \r : fflush : 倒计时的创建: 倒计时的工作原理: 进度条的创建: 不同场景下、打印任意长度的进度条: main .c procbor.c 测试效果: 使用工具…

STM32学习笔记(四) —— 位段别名区的使用

STM32F103RCT6有两个位段区 (SRAM 最低1M空间和片内外设存储区最低1M空间), 这两个区域都有各自的别名区,在别名区中每个字会映射到位段区的一个位,所以在别名区修改一个字相当于修改位段区中对应的一个位 映射公式( 别名区中的字与位段区中的…

jenkins部署(docker)

docker部署,避免安装tomcat 1.拉镜像 docker pull jenkins/jenkins2.宿主机创建文件夹 mkdir -p /lzp/jenkins_home chmod 777 /lzp/jenkins_home/3.启动容器 docker run -d -p 49001:8080 -p 49000:50000 --privilegedtrue -v /lzp/jenkins_home:/var/jenkins_…