【高空无人机视角下的路口车辆与行人检测跟踪与轨迹刻画】

2023-05-16

【高空无人机视角下的路口车辆与行人检测跟踪与轨迹刻画】

  • 背景需求
  • 可参考的方法
    • 1、 opencv + python 实现目标跟踪的方法:
    • 主要代码
      • ① main.py
      • ② items.py
    • 检测效果
    • 2、 dlib库单目标检测方法
    • 3、 深度学习方法
      • 代码
      • 效果
    • 推荐相关目标追踪的博文

背景需求

背景:
项目需要在高空视角下,对视频流中的行人与车辆进行跟踪与轨迹记录,理想的状态如下所示:

在这里插入图片描述
完全达到上述实际达到可能有点难度。但是可以逐步尝试实现。

可参考的方法

1、 opencv + python 实现目标跟踪的方法:

这里是为了更加准确获取具体目标的坐标信息,减小检测模型带来的误差因素,所以考虑单目标的跟踪检测。先用人工标注视频流的第一帧,选择要跟踪的目标,之后进行逐帧跟踪并刻画轨迹。

采用opencv + python 结合的方法

  • 环境依赖
  • opencv-python==3.4.9.33
  • contrib==0.3.0
  • pytho==3.7

主要代码

① main.py


# -*- coding: utf-8 -*-
# @Time    : 2021/09/03
# @Author  : Wupke
# Purpose  :  Single-object detection & Trajectory tracking  using opencv and python

import cv2
from items import MessageItem
import time
import numpy as np

class ObjectTracker(object):
    def __init__(self, dataSet):
        self.cascade = cv2.CascadeClassifier(dataSet)

    def track(self, frame):
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        faces = self.cascade.detectMultiScale(gray, 1.03, 5)
        for (x, y, w, h) in faces:
            cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
        return frame

class Tracker(object):
    '''
    对于指定目标,进行后续跟踪
    '''
    def __init__(self, tracker_type="BOOSTING", draw_coord=True):
        '''
        初始化追踪器种类
        '''
        # 查看opencv版本
        (major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')
        self.tracker_types = ['BOOSTING', 'MIL', 'KCF', 'TLD', 'MEDIANFLOW', 'GOTURN']
        self.tracker_type = tracker_type
        self.isWorking = False
        self.draw_coord = draw_coord
        # 构造追踪器
        if int(minor_ver) < 3:
            self.tracker = cv2.Tracker_createBoosting(tracker_type)
        else:
            if tracker_type == 'BOOSTING':
                self.tracker = cv2.TrackerBoosting_create()
            if tracker_type == 'MIL':
                self.tracker = cv2.TrackerMIL_create()
            if tracker_type == 'KCF':
                self.tracker = cv2.TrackerKCF_create()
            if tracker_type == 'TLD':
                self.tracker = cv2.TrackerTLD_create()
            if tracker_type == 'MEDIANFLOW':
                self.tracker = cv2.TrackerMedianFlow_create()
            if tracker_type == 'GOTURN':
                self.tracker = cv2.TrackerGOTURN_create()

    def initWorking(self, frame, box):
        '''
        追踪器工作初始化,frame:初始化追踪画面,box:追踪的区域
        '''
        if not self.tracker:
            raise Exception("追踪器未初始化")
        status = self.tracker.init(frame, box)
        if not status:
            raise Exception("追踪器工作初始化失败")
        self.coord = box
        self.isWorking = True

    def track(self, frame):
        '''
        开启追踪,记录记录追踪目标坐标
        '''
        message = None
        
        if self.isWorking:
            status, self.coord = self.tracker.update(frame)
            if status:
                message = {"coord": [((int(self.coord[0]), int(self.coord[1])),
                                      (int(self.coord[0] + self.coord[2]), int(self.coord[1] + self.coord[3])))]}
                if self.draw_coord:
                    center_x = ''
                    center_y = ''
                    p1 = (int(self.coord[0]), int(self.coord[1]))
                    p2 = (int(self.coord[0] + self.coord[2]), int(self.coord[1] + self.coord[3]))
                    cv2.rectangle(frame, p1, p2, (255, 0, 0), 2, 1)
                    message['msg'] = "is tracking"
                    center_x,center_y=int((p1[0]+p2[0])/2),int((p1[1]+p2[1])/2)
        return MessageItem(frame, message),center_x,center_y        # 导出绘制的跟踪框中心坐标
        
if __name__ == '__main__':

    a = ['BOOSTING', 'MIL', 'KCF', 'TLD', 'MEDIANFLOW', 'GOTURN']
    tracker = Tracker(tracker_type="KCF")   # 跟踪器可以切换其他的来看效果
    # video = cv2.VideoCapture(0)
    cap = cv2.VideoCapture("E:/Desktop/D_0239.mp4")
    
    '''获得视频流帧数,保存跟踪的视频,保存处理后的视频,注意保存处理后的视频画面帧的大小是否改变等等问题,否则会储存视频失败
    '''
    fps,w,h, = int(cap.get(5)),int(cap.get(3)),int(cap.get(4))
    print('fps: ', fps,'w: ', w,'h: ', h)

    fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') 
    res_path = 'E:/Desktop/实验室文字编辑工作/20210827无人机/demo/result000.mp4'
    res = cv2.VideoWriter(res_path,fourcc,fps,(w,h),True) 
   
    i=0
    car_tri=[]    # 存储系列轨迹点中心的坐标
    while True:
        ret, frame = cap.read()
        frame = cv2.resize(frame, (1200, 800))

        if i==0:
            # 暂停第一帧进行手工标注
                bbox = cv2.selectROI(frame, False)
                tracker.initWorking(frame, bbox)
        i+=1
        #第二帧以后,开始保存每一帧的跟踪框中心坐标
        center=[]
        if (ret):
            item = tracker.track(frame)[0]  # 得到追踪的画面
            x,y= tracker.track(frame)[1:]  # 取到MessageItem(frame, message),center_x,center_y   返回的center_x,center_y 分别赋值给 x,y
            center.append(x)
            center.append(y)
            car_tri.append(center)
            # # 限制轨迹最大长度
            # if len(car_tri)> 300:
            #     for k in range(len(car_tri) - 300):
            #         del car_tri[k]

            # # # 绘制轨迹
            if len(car_tri) > 2:
                for j in range(1, len(car_tri) - 1):
                    pot1_x = car_tri[j][0]
                    pot1_y = car_tri[j][1]
                    pot2_x = car_tri[j + 1][0]
                    pot2_y = car_tri[j + 1][1]
                    cv2.line(frame, (pot1_x, pot1_y), (pot2_x, pot2_y), (255,0,0), 2)
            # print(x,y)
            frame=item.getFrame()
            cv2.imshow("track", frame)
            frame = cv2.resize(frame, (w, h))    # 还原视频的原始尺寸
            res.write(frame)
            k = cv2.waitKey(1) & 0xff
            if k == 27:
                break
    cap.release()
    res.release()
    cv2.destroyAllWindows()

② items.py


#encoding=utf-8
import json
'''
封装类
'''
class MessageItem(object):
    #用于封装信息的类,包含图片和其他信息
    def __init__(self,frame,message):
        self._frame = frame
        self._message = message
    def getFrame(self):
        #图片信息
        return self._frame
    def getMessage(self):
        #文字信息,json格式
        return self._message
    # def getBase64Frame(self):
        #返回base64格式的图片,将BGR图像转化为RGB图像
        # jepg = IOUtil.array_to_bytes(self._frame[...,::-1])
        # return IOUtil.bytes_to_base64(jepg)
    def getBase64FrameByte(self):
        #返回base64格式图片的bytes
        return bytes(self.getBase64Frame())
    def getJson(self):
        #获得json数据格式
        dicdata = {"frame":self.getBase64Frame().decode(),"message":self.getMessage()}
        return json.dumps(dicdata)
    def getBinaryFrame(self):
        return IOUtil.array_to_bytes(self._frame[...,::-1])


检测效果

  • 车辆
    在这里插入图片描述
    在这里插入图片描述
  • 行人
    在这里插入图片描述
    在这里插入图片描述

2、 dlib库单目标检测方法

还有dlib库中的dlib.correlation_tracker()类实现目标跟踪的方法
dlib官方文档入口:
http://dlib.net/python/index.html#dlib.correlation_tracker
相关博文:https://blog.csdn.net/hongbin_xu/article/details/78359663

3、 深度学习方法

采用深度学习方法,先进行检测,在结合跟踪算法进行轨迹刻画。在这种视角下,需要重新训练检测的模型,而且行人目标较小,检测难度大,效果不敢说(尝试yolov+deepsort)。正在整合,后续会更新。

代码

在这里插入代码片

效果

后续更新。。。。。。

在这里插入图片描述

推荐相关目标追踪的博文

https://blog.csdn.net/qq_35488769/article/details/79103264
https://blog.csdn.net/hongbin_xu/article/details/78359663
https://blog.csdn.net/MHxiaoS/article/details/106675585

高空无人机视角下的检测跟踪数据集网址:
① https://www.ind-dataset.com/
② http://aiskyeye.com/download/multi-object-tracking_2021/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【高空无人机视角下的路口车辆与行人检测跟踪与轨迹刻画】 的相关文章

  • 函数声明在头文件中的好处,可以利用静态库隐藏算法

    背景 xff1a 现在有个程序员A想实现一个算法 xff0c 这个算法是俩数之和 xff0c 他自己不会于是他去买程序员B的已经做好的算法 xff0c 但是程序员B不想让他看到算法结构应该怎么做 1 首先程序员B需要写程序 xff0c 包括
  • Javaparser使用

    Javaparser使用 什么是Javaparser 分析 转换 生成Java代码 Javaparser库为你提供了一个 Java 代码的抽象语法树 Abstract Syntax Tree AST 结构允许您以一种简单的编程方式使用 Ja
  • YUV和RGB图像格式说明

    对于进行图像处理的程序员来说 xff0c 图像格式是必须了解的问题 本文不涉及压缩图像格式 xff0c 只对YUV和RGB图像进行描述 1 RGB图像和YUV图像区别 RGB和YUV图像的区别在于色彩空间坐标系描述上不同 xff0c 就如同
  • CMake 常用指令

    文章目录 范式环境 amp 工程配置 96 cmake minimum required 96 96 project 96 96 file 96 添加头文件搜索路径 96 link directories 96 96 add compile
  • (JAVA)国际跳棋--棋里乾坤

    导入 因为假期内被朋友带入坑后起了兴趣 xff0c 但发现网上似乎没有什么人写过国际跳棋的相关制作过程 xff0c 于是制作了一个单纯的java的国际跳棋程序 xff0c 虽然没有AI xff0c 但能够实现玩家双方的任务和皮肤 目前只设置
  • 力扣刷题日记 211. 添加与搜索单词

    211 添加与搜索单词 题目描述题解思路代码结语 题目描述 题解思路 首先 xff0c 这道题要求我们给出所有结果 xff0c 那就意味着我们可能只能选择枚举这一条路 xff0c 然后再看到数据范围 xff0c 好家 伙 xff0c 确实挺
  • 力扣刷题日记 798. 得分最高的最小轮调

    798 得分最高的最小轮调 题目描述题解思路代码结语 题目描述 题解思路 数据范围没有截图到 xff0c 这里的数据范围为0 20000 题目的内容还是很好理解的 xff0c 就是给你一个数组 xff0c 你可以将数组内容向左推移若干次 x
  • Java实现简单的计算器

    文章目录 前言一 主界面部分二 监听器部分三 结果计算部分总结 前言 最近在复习着Java Swing的使用 xff0c 在布局这块反复又看了很久 xff0c 然后突然发现GirdLayout机器适合来做一个计算器的简单样子 xff0c 所
  • 多旋翼飞行器设计与控制(一)

    一 基本概念固定翼直升机多旋翼复合飞行器 二 操控和评价四旋翼操控对比评价局限性 三 发展历史休眠期 xff08 1990前 xff09 复苏期 xff08 1990 2005 xff09 产品方面学术方面 发展期 xff08 2005 2
  • 考试中暴露的问题

    1 注意位运算 可以去看看洛谷里如果城堡不用位运算处理的话会怎样233 2 注意数学函数 xff0c 如sqrt为开根号 xff0c abs为绝对值 xff1b 3 最长上升子序列upper bound与lower bound的用法要知道
  • 10月28日考试解题报告

    考试中的心路历程 说实话第一道题和第三道题真的是水题 xff0c 然鹅我只搞到了100分 xff0c 感觉有些亏 xff0c 最后一题看错了题目 xff0c 导致我的思路开始各种螺旋 xff0c 当其他人都为第二题思考的时候 xff0c 我
  • 10月30日解题报告

    做题思路 第一题表示根本没有想到是线段树这种东西 xff0c 结果看到题解的时候 内心是崩溃的 xff0c 看了线段树还是得多练练 xff0c 第二题是dp xff0c 算是简单 xff0c 但是自己没有想到还是很伤 xff0c 也还是要多
  • C++ 获取string字符串长度的三种方法

    1 用string的成员方法length 获取字符串长度 length 比较直观 xff0c 表示的就是该字符串的长度 include lt string gt include lt iostream gt using namespace
  • sublime text3 搭建python环境

    1 python下载 python安装文件下载 2 安装easy install 方法是下载ez setup py后 xff0c 在cmd下执行 pythonez setup py xff0c 即可自动安装setuptools window
  • C++ 字符串指针和字符串指针数组详解

    C 43 43 处理字符串有两种方式 xff0c 即 xff1a 指针方式和数组方式 数组方式 xff1a char a 61 34 HelloWorld 34 指针方式 xff1a const char s 61 34 HelloWorl
  • 【C++笔记】关于push_back(vector<int>());

    vector lt vector lt int gt gt vec vec push back vector lt int gt vec back push back vec n push back 今天在刷leetcode题的时候见到如上
  • C++ const用法总结

    const 是constant的简写 xff0c 是C 43 43 中极为常见且重要的关键字 xff0c 主要功能是设置某些参数不可修改 xff0c 今天对其用法进行总结记录 一 在变量中的用法 对变量进行修饰是const最基本的用法 xf
  • C++ 函数指针以及对void*(* func)(void *)的解读

    1 函数指针 我们知道调用一个函数的时候可以给其传递参数 xff0c 这个参数可以是变量 xff0c 也可以是变量的引用或者指针 那如果想传递另一个函数可以做到吗 xff1f C提供了函数指针这一用法来完成这个需求 函数在内存中是占据一片空
  • 线程同步之互斥锁

    1 问题 单线程执行任务的场景通常是简单不易出错的 xff0c 但是多线程执行任务时 xff0c 由于线程对于内存空间的共享特性 xff0c 在并发执行时却会产生一些意料之外的错误 如下列程序 xff1a include 34 unpthr

随机推荐

  • C++知识点梳理(1)

    C 43 43 程序由一个或者多个被称为函数的模块组成 和函数从main函数 xff08 全部小写 xff09 开始执行 xff0c 所以main函数必不可少 函数头指向函数的返回值 xff08 如果有函数头 xff09 的类型和函数期望通
  • 串口扩展研究

    串口扩展研究 曾几何时 xff0c 鼠标键盘还是PS 2接口 xff0c 在向USB过渡过程中会有一些 USB to PS 2 神器出现 当主设备 xff08 电脑 xff09 和从设备 xff08 鼠标键盘 xff09 都配标准的USB接
  • cmake 工具 三 add_libary, set_target_properties,target_link_libary,link_directories, link_libary

    一起通过一个例子学一下 add libary xff0c set target properties xff0c link libary xff0c target link libary 四个命令 首先创建如下的文件 xff1a 其中 bu
  • ESP32-C3入门教程 蓝牙篇①——基于Blufi 的 WiFi 智能配网

    文章目录 一 前言 二 WiFi配网方式 三 快速运行 四 运行效果 五 程序流程 精简 5 1 WiFi 初始化 5 2 BLE 初始化 5 3 WiFi 回调函数 5 4 BLE 回调函数 5 5 Blufi 回调函数 5 6 流程图
  • FreeRTOS STM32 线程创建失败,单步运行一看才发现是内存不够

    文章目录 一 FreeRTOS线程创建失败二 失败的解决方法三 成功的解决方法 一 FreeRTOS线程创建失败 今天用STM32板子跑一个测试demo xff0c 结果一上车就翻车 一个简简单单的线程起不来 断点进不去 xff0c 单步运
  • HTML5 播放器

    暂存一些HTML5播放器的资料 xff0c 慢慢消化 使用 HTML5 技术播放视频 使用 Clear Key 加密 MP4 视频并播放 Encrypted Media Extensions An introduction to Encry
  • ESP32-C3入门教程 蓝牙篇③——基于微信小程序和Esp Blufi实现 WiFi配网

    基于微信小程序和Esp Blufi实现 WiFi配网 文章目录 一 前言 二 软件框架 三 软件流程 四 API介绍 五 全部源码 一 前言 本文基于VS Code IDE进行编程 编译 下载 运行等操作 基础入门章节请查阅 ESP32 C
  • 路由器重温——接口配置与管理1

    路由器的接口相对于交换机接口来说最大的特点就是接口类型和配置更为复杂 xff0c 一般可以把路由器上的接口分为三大类 xff1a 一类是用于局域网组网的LAN接口 xff0c 另一类是用于广域网接入 互联的WAN接口 xff0c 最后一类可
  • 路由器接口配置与管理——1

    路由器的接口相对于交换机来说最大的特点就是接口类型和配置更为复杂 xff0c 一般吧路由器上的接口分为三大类 xff1a 一类用于局域网的LAN接口 xff0c 一类用于广域网接入 互联的WAN接口 xff0c 最后一类可以应用于LAN组网
  • 使用A*算法寻找路径

    使用A xff0a 算法首先需要将地图分成一个个块 xff0c 每个块称为一个节点 算法主要是维护两张表 openList和closeList openList用来保存待考察的节点 xff0c closeList用来保存不需要考察的节点 算
  • 关于C++中的#define

    include lt iostream gt using namespace std define ADD x y x 43 y 试卷上是减号 xff0c 本人觉得是加号 int main int m 61 3 int n 61 4 m 4
  • c++常用STL库及常用函数

    临近各种算法比赛 xff0c 相信很多人想笔者一样还总是记不住很多函数的用法 xff0c 特此总结一下常用的STL标准库以及标准函数 xff0c 希望能够有所帮助 1 输入输出 输入输出一般用两个标准库 xff1a include lt c
  • cv2.rectangle()函数

    cv2 rectangle 函数 cv2 rectangle img pt1 pt2 color thickness lineType shift 参数表示依次为 xff1a xff08 图片 xff0c 长方形框左上角坐标 长方形框右下角
  • 微信公众号中视频下载的2种方法

    介绍twitter视频下载的2种方法 文前白话1 使用在线网站2 使用使用桌面版软件GTG 文前白话 提示 xff1a 微信公众号中的很多视频可以在YouTube上 还有推特上找到并去下载保存 1 使用在线网站 链接 xff1a 在线网站
  • 深度剖析WinPcap之(四)——WinPcap的体系架构(1)

    本文转自http eslxf blog 51cto com 918801 197405 WinPcap是Win32平台下用于数据包捕获与网络分析的一个架构 它包含一个内核层数据包过滤器 xff0c 一个底层动态链接库 xff08 packe
  • C++ 学习建议

    C 43 43 缺点之一 xff0c 是相对许多语言复杂 xff0c 而且难学难精 C 43 43 的优点就是即能接触底层也可用于上层开发 我是从C进入C 43 43 xff0c 皆是靠阅读自学 在此分享一点学习心得 个人认为 xff0c
  • 【深度学习-图像分类篇】一文全:Pytorch搭建EfficientNe图像分类网络

    深度学习 图像分类篇 Pytorch搭建EfficientNe图像分类网络 1 理论基础1 1 EfficientNet网络简析EfficientNet 网络结构的改进之处EfficientNet不同模型的参数取值论文中不同 Efficie
  • Linux(多用户下)查看cuda、cudnn版本、查看已经安装的cuda版本、切换不同版本cuda之间的切换等相关命令

    Linux中查看已经安装的CUDA多个版本以及当前软链接的版本 cudnn版本 1 查看GPU使用情况 xff1a 2 查看 CUDA 版本 xff1a 3 查看 CUDNN 版本4 不同版本cuda的切换 xff08 需要有足够的权限 x
  • 【深度学习卷积神经网络中涉及的训练参数与超参数概念理解】

    卷积神经网络中涉及的训练参数与超参数概念理解 文前白话 网络超参数1 输入图像大小2 卷积层超参数卷积核尺寸 卷积核数量 卷积的步长 3 池化层超参数池化核尺寸 池化步长 池化方式 网络训练 优化超参数1 Epoch Batch Batch
  • 【高空无人机视角下的路口车辆与行人检测跟踪与轨迹刻画】

    高空无人机视角下的路口车辆与行人检测跟踪与轨迹刻画 背景需求可参考的方法1 opencv 43 python 实现目标跟踪的方法 xff1a 主要代码 main py items py 检测效果2 dlib库单目标检测方法3 深度学习方法代