高空无人机视角下的路口车辆与行人检测跟踪与轨迹刻画(代码片段)

Wupke Wupke     2022-12-29     139

关键词:

背景需求

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


完全达到上述实际达到可能有点难度。但是可以逐步尝试实现。

可参考的方法

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:]  # 第二帧以后
            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/

实时车辆行人多目标检测与跟踪系统-上篇(ui界面清新版,python代码)

...:本文详细介绍如何利用深度学习中的YOLO及SORT算法实现车辆、行人等多目标的实时检测和跟踪,并利用PyQt5设计了清新简约的系统UI界面,在界面中既可选择自己的视频、图片文件进行检测跟踪,也可以通过电脑自带的摄像头进... 查看详情

行人车辆检测与计数系统(python+yolov5深度学习模型+清新界面)(代码片段)

摘要:行人车辆检测与计数系统用于交通路口行人及车辆检测计数,道路人流量、车流量智能监测,方便记录、显示、查看和保存检测结果。本文详细介绍行人车辆检测,在介绍算法原理的同时,给出Python的... 查看详情

[autocars]基于计算机视觉的无人车感知

...别(深度学习):行人、行驶空间、地标、红绿灯、其他车辆;跟踪:OpticalFlow运动预测算法(2)车辆的定位(基于拓扑与地标的算法,基于几何的视觉里程计算法)4OpticalFlow和立体视觉OpticalFlow:图片序列或视频中像素级的密... 查看详情

无人驾驶(三)行人跟踪算法

...工程学院【嵌牛导读】本文主要介绍了无人驾驶中所需的行人跟踪算法【嵌牛鼻子】无人驾驶环境感知计算机视觉卡尔曼滤波粒子滤波均值漂移【嵌牛提问】无人驾驶中所用到的行人跟踪算法有哪些【嵌牛正文】行人跟踪一直是... 查看详情

自动驾驶十字路口解决方案

自动驾驶十字路口解决方案智能城市出行与交通枢纽,能够改善交通流量,减少污染,并向驶近的网联车辆和行人发送潜在危险信息。  一.大陆集团版智能十字路口创新:该枢纽有两条智能十字路口,配备了大陆的短程... 查看详情

赛题分析

一、赛题简介基于对公共交通路口摄像头类似视角的影像数据进行处理,采用计算机视觉的算法对各种复杂的交通场景进行检测识别。二、业务场景描述运用计算机视觉对我们生活中的交通场景进行智能识别,其要求参赛选手的... 查看详情

在行驶中前方有障碍物,无人驾驶技术可以自动识别吗?

...障碍物的运动轨迹,即目标跟踪问题。其中,多目标环境下的数据关联是多目标跟踪的重要问题。2.障碍物轨迹预测预测障碍物运动轨迹的方法可以分为静态处理、假设状态保持和概率轨迹模型法三类。静态处理是最简单的方法... 查看详情

无人驾驶车辆轨迹跟踪控制文献分享

...lkiffliAbdulKadir论文类型:综述性论文(针对常用的车辆模型、常用的控制方法论、以及用于评估控制器性能的性能标准对路径跟踪控制进行了综述)。摘要部分:Autonomousvehiclefieldofstudyhasseenconsiderableresearcheswithinthre... 查看详情

目标检测与跟踪(行人双向计数)

目标检测与跟踪(行人双向计数)本项目基于yolov5检测,基于deepsort追踪,采用撞线计数,再根据前后帧人的坐标位置判断行走方向,检测展示效果:(图片来源均来自我室友)欢迎评论留言。 查看详情

行业级开源无人机目标追踪,高空助力抓贼!

活久见!成都一高楼惊险无人机抓小偷视频中危险动作,请勿模仿!本次实验中我们使用的是Prometheus600(P600)行业级无人机研发平台(此平台适用于无人机行业应用开发与室外环境下的无人机算法验证... 查看详情

基于opencv对高空拍摄视频消抖处理(代码片段)

一、问题背景无人机在拍摄视频时,由于风向等影响因素,不可避免会出现位移和旋转,导致拍摄出的画面存在平移和旋转的帧间变换,即“抖动”抖动会改变目标物体(车辆、行人)的坐标,给后续的检测、跟... 查看详情

《无人驾驶车辆模型预测控制》——路径规划及轨迹跟踪控制

...接受来自规划层的局部参考轨迹,输出前轮偏角来对车辆进行控制。车型选择车型选择工况设置工况设置Simulink框图轨迹重规划结果图局部路径规划以及路径跟踪核心资源见下!需要系统性学习的朋友,请点击下方图... 查看详情

交通信号灯检测与行人过马路策略

...中至关重要。传统CV的研究中,更多的是针对比较简单的高空架空的交通灯的识别。在复杂的城市环境中,交通灯的检测和识别仍然是一个比较困难的问题。虽然目前借助于DeepLearning的技术,交通灯的识别效果有了很大的进步。... 查看详情

探究“黑科技”:自动驾驶中的对象追踪技术丨曼孚科技

...经过上千公里的测试。许多自动驾驶公司为了更好地掌握车辆的安全性能,会在训练中增设障碍物,如果车辆能够成功规避障碍物,说明该自动驾驶车辆更安全。而对象追踪技术的出现,对解决这类问题起到了关键性作用。作为... 查看详情

行业级开源无人机目标追踪,高空助力抓贼!

活久见!成都一高楼惊险无人机抓小偷视频中危险动作,请勿模仿!本次实验中我们使用的是Prometheus600(P600)行业级无人机研发平台(此平台适用于无人机行业应用开发与室外环境下的无人机算法验证... 查看详情

结合工程实践选题调研分析同类软件产品

...等,如果发现异常状况能够及时处理。   2、车辆辅助驾驶行人检测可以检测出车辆前方的行人并针对实际状况采取相应的措施,是车辆辅助驾驶技术中不可或缺的一部分。结合其他一些技术,我们甚至可以让车辆自... 查看详情

车辆分割和跟踪

...【问题描述】:我从事一个项目已经有一段时间了,在从无人机捕获的视频中检测和跟踪(移动)车辆,目前我正在使用一个支持向量机,该SVM训练了从车辆和背景图像。然后,我使用滑动窗口检测方法来尝试定位图像中的车辆... 查看详情

超强实时跟踪系统首次开源支持跨镜头多类别小目标跟踪

...面临被检目标多、相互遮挡、图像扭曲变形、背景杂乱、视角差异大、目标小且运动速度快等产业难题。▲ 视频引用公开数据集[1][2][3][4]那如何快速获得这个能力呢?今天给大家介绍的不仅仅是单独的智能视觉算法,而... 查看详情