【目标跟踪】多相机环视跟踪

2024-01-25 07:36
文章标签 目标 相机 跟踪 环视

本文主要是介绍【目标跟踪】多相机环视跟踪,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、前言
  • 二、流程图
  • 三、实现原理
    • 3.1、初始化
    • 3.2、输入
    • 3.3、初始航迹
    • 3.4、航迹预测
    • 3.5、航迹匹配
    • 3.6、输出结果
  • 四、c++ 代码
  • 五、总结

一、前言

  1. 相机目标跟踪主要是为了实现 360 度跟踪。单相机检测存在左右后的盲区视野。
  2. 在智能驾驶领域,要想靠相机实现无人驾驶,相机必须 360 度无死角全覆盖。
  3. 博主提供一种非深度学习方法,采用kalman滤波+匈牙利匹配方式实现环视跟踪。有兴趣可以参考往期【目标跟踪】系列博客。
  4. 本文干货满满,可以先点赞关注收藏,以免下次找不到。欢迎各位吴彦祖私信交流学习。

二、流程图

干货怎么会少了流程图,上图!上图!上图!。流程图用 processon 制作的,不是付费软件买不起,而是免费的更有性价比。

在这里插入图片描述

这里最重要的就是航迹管理,对于四路相机(front, left, right, back) 检测的目标都需要管理。这里面不仅要对单相机目标进行跟踪,且对跨相机的目标也需要进行跟踪,还有各种匹配,初始化,开始消亡等到。想想都头皮发麻,那到底怎么做?别慌,让我娓娓道来。

街上熙熙攘攘的人群交头接耳,果然雨过天晴就会有聊不完的话题。三只白鹭停泊在河边享受着阳光的沐浴,不时煽动自己羽毛,引起阵阵涟漪,如此惬意无不让打工人憧憬。远处的山峰层峦叠嶂,仿佛去到世界尽头。命运的齿轮正在转动,会当凌绝顶,一览纵山下。

wc !!!思绪差点飘离银河系,还是敲键盘要紧。下面看看实现原理。

三、实现原理

3.1、初始化

保存四路相机参数:4路相机内参与外参。

制定表格 1920 * 1080 ,用于后续判断计算校正后的像素点。对整张图片进行校正会占用大量 CPU,我们采用对原图进行计算。

在这里插入图片描述

3.2、输入

nuscenes 是六路相机。我们这里是四路相机,全部都是 190° 鱼眼相机。

输入四路相机检测结果。当前相机当前帧的所有目标信息

  • 二维 box 检测框 (x,y,w,h)
  • 目标列表 label。如person、car等
  • 目标的置信度 score

演示这里采取的是 2D 检测。如果是 3D 检测也是类似计算,且 3D 检测定位更加精准。


3.3、初始航迹

(1) 划分 4 象限

在这里插入图片描述

(2) 划分 8 区域

前相机第4象限、前相机第1象限、右相机第3象限、右相机第4象限、后相机第2象限、后相机第3象限、左相机第1象限、左相机第2象限。

在这里插入图片描述

(3) 划分 2 类

前相机第4象限、右相机第3象限、后相机第2象限、左相机第1象限 为一类 firstBox。

右相机第4象限、后相机第3象限、左相机第2象限、前相机第1象限 为一类 secondBox。

(4) 分配 id

当目标是属于 firstBox 一类的目标时,此时直接分配 id 。分配一个 id ,则 idCount ++。

(5) 匹配

sencondBox 中的目标需要与 firstBox 目标匹配。计算距离与角度。

如果匹配上时,id = firstBox 目标 id

如果未匹配上时,id = idCount , idCount ++

3.4、航迹预测

这部分比较简单, 正常预测就行。

对每个目标的box进行预测; 对每个目标的状态,距离、速度、加速度进行预测; 得到预测后的目标状态、box、相应传感器(枚举)。

3.5、航迹匹配

(1) 预测框与检测框

预测框是上一帧所获得的预测框;检测框是当前检测信息的检测框。同时对目标有预测的距离与测量距离

(2) 匈牙利匹配矩阵

如果属于不同相机检测的目标,则设为默认最大值;如果属于同一相机检测目标,计算iou。这个是与单相机跟踪类似。

(3) 匹配修正

匹配上的目标,修正预测的状态与box。此时idCount 不变。

(4) 未匹配的检测框

对于未匹配的检测框,寻找航迹中在其他相机的目标,进行再次匹配。如果匹配上,则未匹配检测框id = 其他相机目标id。否则赋予id = idCount,idCount++。

3.6、输出结果

输出俯视角下所有目标的位置(x, y)。

四、c++ 代码

这部分代码比较多,展示划分象限初始航迹代码。其他代码放到资源自行下载。

// 1、管理航迹信息
void Tracking::ManageTrack(std::vector<TrackingBox> detectData) 
{std::vector<StateBox> firstBox;                 // 目标所处相机与第几象限 front 4, right 3, back 2, left 1 std::vector<StateBox> secondBox;                // 目标所处相机与第几象限 right 4, back 3, left 2, front 1 // 1.1 分配idfor (unsigned int i = 0; i < detectData.size(); i++) {StateBox stateBox;stateBox.sensor = detectData[i].sensor;                                       // 相机传感器的方位stateBox.label = detectData[i].label;                                         // 目标标签stateBox.score = detectData[i].score;                                         // 目标置信度stateBox.box = detectData[i].box;                                             // 检测框std::vector<float> p = detectData[i].position;                                // 根据图像像素获取世界位置 x,y相对于车体stateBox.position = p;stateBox.state = {(cv::Mat_<float>(6, 1) << p[0], 0, 0, p[1], 0, 0), pInit};  // 初始化distanceKalman的状态与协方差if ((stateBox.sensor == 0 && p[1] < 0) || (stateBox.sensor == 1 && p[0] < 0) || (stateBox.sensor == 2 && p[1] > 0) || (stateBox.sensor == 3 && p[0] > 0) ) {stateBox.kBox = KalmanTracker(detectData[i].box);                         // KalmanTracker所需的boxstateBox.id = countId;countId++;firstBox.push_back(stateBox);}else {secondBox.push_back(stateBox);}}for (auto box:firstBox) {trackers.push_back(box);}// 1.2 匹配idunsigned int firstNum = firstBox.size();                             // 前相机在右侧个数unsigned int secondNum = secondBox.size();                           // 右相机在前侧个数std::vector<std::vector<double>> matrix;                             // 关联矩阵->匈牙利匹配matrix.resize(firstNum, std::vector<double>(secondNum, 1));          // resize关联矩阵大小std::vector<cv::Point> matchedPairs;  if (firstNum != 0 && secondNum != 0) {for (unsigned int i = 0; i < firstNum; i++) {for (unsigned int j = 0; j < secondNum; j++) {matrix[i][j] = GetWeight(firstBox[i].position, secondBox[j].position); // 计算角度权重}}HungarianAlgorithm hungAlgo;std::vector<int> assignment; hungAlgo.Solve(matrix, assignment);     // 匈牙利匹配计算std::set<int> unMatchedSecondBox;       // 存放未匹配的sencond 类型的框for (unsigned int i = 0; i < firstNum; ++i) {if (assignment[i] == -1) { continue;                       // 过滤掉无效的值}matchedPairs.push_back(cv::Point(i, assignment[i]));}}// 1.3 修正idint firstId, secondId;for (unsigned int i = 0; i < matchedPairs.size(); i++) {firstId = matchedPairs[i].x; secondId = matchedPairs[i].y; if (matrix[firstId][secondId] < hungarianThreshold) {secondBox[secondId].kBox = KalmanTracker(detectData[i].box);secondBox[secondId].id = firstBox[firstId].id;trackers.push_back(secondBox[secondId]);}}for (auto secBox:secondBox) {if (secBox.id == -1) {secBox.kBox = KalmanTracker(secBox.box);secBox.id = countId;countId++;trackers.push_back(secBox);}}
}

五、总结

在计算过程中,特别注意边缘目标处理。由远到近目标航迹管理需要当心判断。还有马氏距离匹配参数、距离权重、kalamn参数需要自行调整。在宽阔场景,跨相机重要目标匹配成功率可以高达 80%

代码仅供参考,禁止商业用途。欢迎私信交流。

这篇关于【目标跟踪】多相机环视跟踪的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/642536

相关文章

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

Verybot之OpenCV应用三:色标跟踪

下面的这个应用主要完成的是Verybot跟踪色标的功能,识别部分还是居于OpenCV编写,色标跟踪一般需要将图像的颜色模式进行转换,将RGB转换为HSV,因为对HSV格式下的图像进行识别时受光线的影响比较小,但是也有采用RGB模式来进行识别的情况,这种情况一般光线条件比较固定,背景跟识别物在颜色上很容易区分出来。         下面这个程序的流程大致是这样的:

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注类别数:4 标注类别名称:["Platelets","RBC","WBC","sickle cell"] 每个类别标注的框数:

海鸥相机存储卡格式化如何恢复数据

在摄影的世界里,‌每一张照片都承载着独特的记忆与故事。‌然而,‌当我们不慎将海鸥相机的存储卡格式化后,‌那些珍贵的瞬间似乎瞬间消逝,‌让人心急如焚。‌但请不要绝望,‌数据恢复并非遥不可及。‌本文将详细介绍在海鸥相机存储卡格式化后,‌如何高效地恢复丢失的数据,‌帮助您重新找回那些宝贵的记忆。‌ 图片来源于网络,如有侵权请告知 一、‌回忆备份情况 ‌海鸥相机存储卡格式化如何恢复数据?在意

Linux内置的审计跟踪工具:last命令

如果你是一个服务器管理员,你或许知道你要保护你的服务器的话,不仅是从外部,还要从内部保护。Linux有一个内置工具来看到最后登陆服务器的用户,可以帮助你保护服务器。   这个命令是last。它对于追踪非常有用。让我们来看一下last可以为你做些什么。   last命令的功能是什么   last显示的是自/var/log/wtmp文件创建起所有登录(和登出)的用户。这个文件是二进制

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户

[数据集][目标检测]智慧农业草莓叶子病虫害检测数据集VOC+YOLO格式4040张9类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4040 标注数量(xml文件个数):4040 标注数量(txt文件个数):4040 标注类别数:9 标注类别名称:["acalcerosis","fertilizer","flower","fruit","grey

机器视觉硬件选型根据某项目相机镜头

一 项目总需求 1、大视野检测需求: (1)大视野: ①产品尺寸15.6寸屏幕,产品大小:350mm x 225mm; ②产品料盘尺寸大小:565mm x 425mm; ③工作距离:880mm;检测精度:500μm; 1、大视野检测需求: (1)大视野: ①产品尺寸15.6寸屏幕,产品大小:350mm x 225mm; ②产品料盘尺寸大小:565mm x 425mm; 工作距离: