[C++]基于C++opencv结合vibe和sort tracker实现高空抛物实时检测
【vibe算法介绍】
ViBe算法是一种高效的像素级视频背景建模和前景检测算法。以下是对该算法的详细介绍:
一、算法原理
ViBe算法的核心思想是通过为每个像素点存储一个样本集,利用该样本集与当前像素值进行比较,从而判断该像素是否属于背景。算法的主要步骤包括背景模型的初始化、前景检测过程和背景模型的更新方法。
- 背景模型的初始化:
- 在初始时刻(如第一帧图像),为每个像素点随机选择其邻域像素的像素值作为背景模型的样本值。这样可以确保背景模型在开始时即具有一定的鲁棒性。
- 前景检测过程:
- 对于后续的图像序列,算法会将每个新的像素值与背景模型中的样本进行比较。
- 如果新像素值与背景模型中的样本值差异小于预设的阈值,则该像素被判定为背景;否则,被判定为前景。
- 背景模型的更新方法:
- ViBe算法的更新策略具有时间和空间上的随机性。
- 在时间随机性方面,算法会随机选择一个背景模型进行更新,以模拟像素值随时间变化的不确定性。
- 在空间随机性方面,算法会在被判定为背景的像素点的邻域中随机选择一个像素值来更新背景模型,以模拟像素值在空间上的变化。
二、算法优点
- 内存占用少:由于每个像素只需存储一个样本集,因此内存占用较少。
- 性能优越:算法的性能优于混合高斯、参数化方法等传统方法,尤其在处理动态背景时表现出色。
- 无参数法:算法无需手动调整参数,可以直接应用于各种场景。
- 抗噪能力强:由于采用随机更新策略,算法对噪声具有较强的鲁棒性。
三、算法挑战与限制
- Ghost区域:在某些情况下,算法可能会出现误检,将前景物体误判为背景,形成所谓的“Ghost”区域。
- 环境变化适应性:算法需要能够适应环境的变化,如光照变化、相机抖动等。
- 密集物体检测:对于图像中密集出现的物体(如树叶、树干等),算法的检测效果可能受到一定影响。
综上所述,ViBe算法是一种高效、鲁棒的像素级视频背景建模和前景检测算法,具有广泛的应用前景。然而,在实际应用中仍需注意其挑战与限制,并进行相应的优化和改进。
【sort track算法介绍】
SORT(Simple Online and Realtime Tracking)算法是一种简单、高效且实用的多目标跟踪算法。以下是对SORT算法的介绍,内容将按照清晰的格式分点表示,并尽可能参考文章中的相关数字和信息:
一、算法概述
- 全称:Simple Online and Realtime Tracking(SORT)
- 特点:简单、高效、实时性强
- 应用领域:适用于各种需要实时多目标跟踪的场景,如监控视频分析、自动驾驶汽车感知、无人机追踪等
二、算法原理
1. 核心组件
- 卡尔曼滤波:用于预测目标在下一帧中的位置。卡尔曼滤波基于前一帧的目标位置和速度来预测当前帧的目标位置,并基于测量值(即检测到的目标位置)来更新预测值,以达到更精确的估计。
- 匈牙利算法:用于解决数据关联问题,即确定前后两帧中真正匹配的目标。匈牙利算法通过计算前后两帧目标之间的相似度矩阵,并求解该矩阵来找到最佳匹配。
2. 工作流程
- 目标检测:使用目标检测器(如Faster R-CNN)在每一帧中检测目标,得到目标框(Detections)。
- 预测:使用卡尔曼滤波器预测当前帧的轨迹(Tracks)。
- 匹配:将目标框(Detections)和轨迹(Tracks)进行IOU(Intersection over Union)匹配。匹配结果分为三种:
- Matched Track:成功匹配的目标和轨迹。
- Unmatched Tracks:未能成功匹配的目标轨迹,被认为是失配。如果失配持续了T次(T是一个预设的阈值),该目标ID将从待跟踪目标中删除。
- Unmatched Detections:未能成功匹配到轨迹的目标框,需要为其分配一个新的轨迹。
- 更新:卡尔曼滤波根据匹配的轨迹状态预测下一帧的目标框状态,并更新所有轨迹的状态。
三、算法特点
- 实时性强:由于算法复杂度低,SORT算法可以实现高速跟踪,据参考文章所述,追踪器可以实现260Hz的速度。
- 简单易用:代码结构清晰,依赖库少,便于理解和集成到其他项目中。
- 兼容性强:可在Windows和Linux环境下运行,适用范围广。
- 灵活性:提供参数调整,适应不同场景的需求。
四、优缺点
- 优点:
- 速度快:处理速度快,适用于实时应用。
- 准确性高:在没有遮挡的情况下,准确性较高。
- 缺点:
- 对遮挡处理不足:当目标被遮挡时,ID切换次数较高,可能导致跟踪不准确。
- 未考虑目标外观特征:仅使用检测框的位置和大小进行目标匹配,未考虑目标的外观特征。
五、总结
SORT算法以其简单、高效和实时性强的特点,在多目标跟踪领域具有广泛的应用前景。然而,在实际应用中仍需注意其处理遮挡和目标外观特征方面的限制,并根据具体需求进行相应的优化和改进。
【测试环境】
vs2019
opencv==4.8.0
x64 release(Debug暂时没测试通过)
【部分实现源码】
#define _CRT_SECURE_NO_WARNINGS
#include "tracker.hpp"
#include "trajectory.hpp"
#include "utils.hpp"
#include "vibe_sequential.hpp"
#include <array>
#include <chrono>
#include <cmath>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <memory>
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <stdexcept>
#include <string>
#include <string_view>
#include <thread>
using namespace std;
using namespace cv;
int main(int argc, char* argv[]) {int maxNumBlobs = 64;VideoCapture capture("test.mp4");if (!capture.isOpened())return -1;double fps = capture.get(cv::CAP_PROP_FPS); // 帧率int width = capture.get(cv::CAP_PROP_FRAME_WIDTH); // 视频帧宽度int height = capture.get(cv::CAP_PROP_FRAME_HEIGHT); // 视频帧高度// Create vibe algorithm instanceauto vibe = std::make_unique<ViBeSequential>(height, width, 14, 20, 2, 5);// Create tracker instanceauto tracker = std::make_unique<SortTracker>(3, 3);auto detections = std::vector<cv::Rect2f>(8);cv::Mat fgMask(height, width, CV_8U);cv::Mat updateMask(height, width, CV_8U);cv::Mat fgBlobLabels(height, width, CV_32S);cv::Mat fgBlobCentroids(64, 2, CV_64F);cv::Mat fgBlobStats(64, 5, CV_32S);// Prepare structure elements for morphological filteringcv::Mat se3x3 = cv::getStructuringElement(cv::MORPH_ELLIPSE, { 3, 3 });cv::Mat se5x5 = cv::getStructuringElement(cv::MORPH_ELLIPSE, { 5, 5 });cv::Mat se7x7 = cv::getStructuringElement(cv::MORPH_ELLIPSE, { 7, 7 });// Prepare runtime measurementauto tm = cv::TickMeter();while (true){Mat frame;capture >> frame; // 从相机读取新一帧if (frame.empty()){break;}/* Segmentation and update. */tm.reset();tm.start();// Run background segmentation with ViBevibe->segment(frame, fgMask);// Process update maskcv::morphologyEx(fgMask, updateMask, cv::MORPH_OPEN, se3x3);// Update ViBevibe->update(frame, updateMask);// Post-processing on foreground maskcv::morphologyEx(fgMask, fgMask, cv::MORPH_OPEN, se3x3);cv::morphologyEx(fgMask, fgMask, cv::MORPH_CLOSE, se5x5);tm.stop();double vibeProcessTimeMs = tm.getTimeMilli();// Find all connected componentsint numFgBlobs = cv::connectedComponentsWithStats(fgMask, fgBlobLabels, fgBlobStats, fgBlobCentroids);if (numFgBlobs > maxNumBlobs) {// Too many blobs, consider this frame invalidtracker->clear();continue;}detections.clear();for (int i = 1; i < numFgBlobs; i++) {auto* blobStat = fgBlobStats.ptr<int>(i);int x = blobStat[cv::CC_STAT_LEFT] - 6;int y = blobStat[cv::CC_STAT_TOP] - 6;int w = blobStat[cv::CC_STAT_WIDTH] + 12;int h = blobStat[cv::CC_STAT_HEIGHT] + 12;// int a = blobStat[cv::CC_STAT_AREA];// Add new bboxdetections.emplace_back(x, y, w, h);// auto color = colors.row(i % colors.rows);cv::rectangle(frame, { x, y, w, h }, { 255, 50, 0 }, 1);}tm.reset();tm.start();// Update tracker with newly detected bboxestracker->update(detections, frame);tm.stop();double trackingTimeMs = tm.getTimeMilli();std::array<char, 64> str;std::sprintf(str.data(),"[PROCESS TIME] ViBe: %.2f ms, Tracking: %.2f",vibeProcessTimeMs,trackingTimeMs);// Draw process time measurement result on current framecv::putText(frame,str.data(),{ 12, 30 },cv::FONT_HERSHEY_SIMPLEX,0.5,{ 0, 0, 255 },1,cv::LINE_AA);cv::imshow("frame", frame);cv::imshow("fgmask", fgMask);cv::imshow("update mask", updateMask);if (char(waitKey(2)) == 'q'){break;}}capture.release();cv::destroyAllWindows();}
【效果展示】
【视频演示】
基于C++opencv结合vibe和sort tracker实现高空抛物实时检测_哔哩哔哩_bilibili【测试环境】vs2019opencv==4.8.0x64 release(Debug暂时没测试通过)更多信息参考博文:blog.csdn.net/FL1623863129/article/details/139493227, 视频播放量 6、弹幕量 0、点赞数 0、投硬币枚数 0、收藏人数 0、转发人数 0, 视频作者 未来自主研究中心, 作者简介 未来自主研究中心,相关视频:基于onnx模型加密与解密深度学习模型保护方法介绍,使用纯opencv部署yolov8目标检测模型onnx,C++版本yolov8的onnx模型加密方法保护自己模型和版权,将yolov8封装成一个类几行代码完成语义分割任务,使用C#的winform部署yolov8的onnx实例分割模型,使用C#调用libotrch-yolov5模型实现全网最快winform目标检测,Python自动答题脚本刷题,100%正确率,附源码!可刷课!期末再也不用担心挂科了!Python教程Python入门编程入门爬虫代码Python基础安装,C#调用yolov7进行目标检测winform开发,基于yolov8官方目标追踪botsort和bytetrack源码开发视频演示,使用C#部署openvino-yolov5s模型https://www.bilibili.com/video/BV1zD421g7zR/?vd_source=989ae2b903ea1b5acebbe2c4c4a635ee
【源码下载地址】https://download.csdn.net/download/FL1623863129/89403409
相关文章:
[C++]基于C++opencv结合vibe和sort tracker实现高空抛物实时检测
【vibe算法介绍】 ViBe算法是一种高效的像素级视频背景建模和前景检测算法。以下是对该算法的详细介绍: 一、算法原理 ViBe算法的核心思想是通过为每个像素点存储一个样本集,利用该样本集与当前像素值进行比较,从而判断该像素是否属于背景…...
Apache Doris 基础 -- 数据表设计(模式更改)
用户可以通过schema Change操作修改现有表的模式。表的模式主要包括对列的修改和对索引的修改。这里我们主要介绍与列相关的Scheme更改。对于与索引相关的更改,可以查看数据表设计/表索引,查看每个索引的更改方法。 1、术语 基本表(Base Ta…...
【机器学习】【遗传算法】【项目实战】药品分拣的优化策略【附Python源码】
仅供学习、参考使用 一、遗传算法简介 遗传算法(Genetic Algorithm, GA)是机器学习领域中常见的一类算法,其基本思想可以用下述流程图简要表示: (图参考论文:Optimization of Worker Scheduling at Logi…...
电子电气架构 ---车载安全防火墙
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…...
解决selenium加载网页过慢影响程序运行时间的问题
在用selenium爬取动态加载网页时,发现网页内容都全部加载完了,但是页面还在转圈,并且获取页面内容的代码也没有执行,后面了解到selenium元素操作等方法是需要等待页面所有元素完全加载完成后才开始执行的,所以在页面未…...
何为云防护?有何作用
云防护又称云防御。随着Internet互联网络带宽的增加和多种DDOS 黑客工具的不断发布,云计算越演越热,DDOS拒绝服务攻击的实施越来越容易,DDOS攻击事件正在成上升趋势。出于商业竞争、打击报复和网络敲诈等多种因素,导致很多IDC 托管…...
2024050402-重学 Java 设计模式《实战责任链模式》
重学 Java 设计模式:实战责任链模式「模拟618电商大促期间,项目上线流程多级负责人审批场景」 一、前言 场地和场景的重要性 射击🏹需要去靶场学习、滑雪🏂需要去雪场体验、开车🚗需要能上路实践,而编程…...
centos7安装字体
1.安装命令 yum install fontconfig #字体库命令 yum install mkfontscale #更新字体命令2.安装字体(注意权限问题) 进入目录 /usr/share/fonts ,该目录是 centos7 字体库的默认安装目录。在该目录下创建一个文件夹 ekp (名字…...
Llama模型家族之使用 ReFT技术对 Llama-3 进行微调(三)为 ReFT 微调准备模型及数据集
LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…...
学习Canvas过程中2D的方法、注释及感悟一(通俗易懂)
1.了解Canvas: Canvas是前端一个很重要的知识点,<canvas>标签用于创建画布绘制图形,通过JavaScript进行操作。它为开发者提供一个动态绘制图形的区域,用于创建图标、游戏动画、图像处理等。 对于能够熟练使用Canvas的开发者…...
《TCP/IP网络编程》(第十三章)多种I/O函数(2)
使用readv和writev函数可以提高数据通信的效率,它们的功能可以概括为**“对数据进行整合传输及发送”**。 即使用writev函数可以将分散在多个缓冲中的数据一并发送,使用readv函数可以由多个缓冲分别接受,所以适当使用他们可以减少I/O函数的调…...
Java集合汇总
Java中的集合框架是Java语言的核心部分,提供了强大的数据结构来存储和操作对象集合。集合框架位于java.util包中,主要可以分为两大类:Collection(单列集合)和Map(双列集合)。下面是对它们的总结…...
度小满金融大模型的应用创新
XuanYuan/README.md at main Duxiaoman-DI/XuanYuan GitHub...
Android WebView上传文件/自定义弹窗技术,附件的解决方案
安卓内核开发 其实是Android的webview默认是不支持<input type"file"/>文件上传的。现在的前端页面需要处理的是: 权限 文件路径AndroidManifest.xml <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/&g…...
selenium 输入框、按钮,输入点击,获取元素属性等简单例子
元素操作 nput框 输入send_keys, input框 清除clear(), 按钮 点击click() 按钮 提交submit() 获取元素 tag_name、 class属性值、 坐标尺寸 """ input框 输入1次,再追加输入一次, 清除, 再重新输入&…...
结构体构造函数
【知识点:结构体构造函数】下面两段代码等价。 (1)结构体构造函数写法 struct LinkNode {int data;LinkNode* next;LinkNode(int x):data(x),next(NULL) {} }; LinkNode* Lnew LinkNode(123); (2)非结构体构造函数写…...
基于单片机的电子万年历设计
摘要: 本设计以 AT89C51 单片机为主控器,使用 DS1302 时钟芯片、DS18B20 温度芯片、LCD1602 显示模块,利用Proteus 仿真软件和 Keil 编译软件进行了基于单片机的电子万年历仿真,设计的万年历可以在液晶上显示时间,同时还具有时间校准、温度显示等功能。 关键词 :单片机…...
大厂真实面试题(一)
滴滴大数据sql 取出累计值与1000差值最小的记录 1.题目 已知有表t_cost_detail包含id和money两列,id为自增,请累加计算money值,并求出累加值与1000差值最小的记录。 2.分析 本题主要是想找到累加值域1000差距最小的记录,也就是我们要对上述按照id进行排序并且累加,并…...
Docker搭建ELKF日志分析系统
Docker搭建ELKF日志分析系统 文章目录 Docker搭建ELKF日志分析系统资源列表基础环境一、系统环境准备1.1、创建所需的映射目录1.2、修改系统参数1.3、单击创建elk-kgc网络桥接 二、基于Dockerfile构建Elasticsearch镜像2.1、创建Elasticsearch工作目录2.2、上传资源到指定工作路…...
把系统引导做到U盘,实现插上U盘才能开机
前言 有个小伙伴提出了这样一个问题:能不能把U盘制作成电脑开机的钥匙? 小白稍微思考了一下,便做了这样一个回复:可以。 至于为什么要思考一下,这样会显得我有认真思考他提出的问题。 Windows7或以上系统均支持UEF…...
【计算机网络基础知识】
首先举一个生活化的例子,当你和朋友打电话时,你可能会使用三次握手和四次挥手的过程进行类比: 三次握手(Three-Way Handshake): 你打电话给朋友:你首先拨打你朋友的电话号码并等待他接听。这就…...
个股场外期权个人如何参与买卖?
个股场外期权作为一种金融衍生品,为个人投资者提供了多样化的投资选择和风险管理工具。想要参与个股场外期权的买卖,以下是一些关键步骤和考虑因素。 文章来源/:财智财经 第一步:选择合适的金融机构 首先,个人投资者需…...
程序猿大战Python——pycharm软件的使用
基础配置 目标:了解PyCharm软件的基础配置处理。 修改背景颜色: Appearance -> Theme 修改字体大小: 搜索font -> Font 例如,一起完成背景、字体大小的修改。 总结: (1)如果要对PyChar…...
Unity Standard shader 修改(增加本地坐标裁剪)
本想随便找一个裁剪的shader,可无奈的是没找到一个shader符合要求,美术制作的场景都是用的都标准的着色器他们不在乎你的功能逻辑需求,他们只关心场景的表现,那又找不到和unity标准着色器表现一样的shader 1.通过贴图的透明通道做…...
【数据结构】排序——插入排序,选择排序
前言 本篇博客我们正式开启数据结构中的排序,说到排序,我们能联想到我之前在C语言博客中的冒泡排序,它是排序中的一种,但实现效率太慢,这篇博客我们介绍两种新排序,并好好深入理解排序 💓 个人主…...
2024.6.9刷题记录
目录 一、1103. 分糖果 II 1.模拟 2.数学 二、312. 戳气球 1.递归-记忆化搜索 2.区间dp 三、2. 两数相加 1.迭代 2.递归-新建节点 3.递归-原节点 四、4. 寻找两个正序数组的中位数 1.堆 2.双指针二分 五、5. 最长回文子串 1.动态规划 2.中心扩展算法 六、6. Z…...
Matlab|遗传粒子群-混沌粒子群-基本粒子群
目录 1 主要内容 2 部分代码 3 效果图 4 下载链接 1 主要内容 很多同学在发文章时候最犯愁的就是创新点创新点创新点(重要的事情说三遍),对于采用智能算法的模型,可以采用算法改进的方式来达到提高整个文章创新水平的目的&…...
31|HTTP3:甩掉TCP、TLS 的包袱,构建高效网络
前面两篇文章我们分析了HTTP/1和HTTP/2,在HTTP/2出现之前,开发者需要采取很多变通的方式来解决HTTP/1所存在的问题,不过HTTP/2在2018年就开始得到了大规模的应用,HTTP/1中存在的一大堆缺陷都得到了解决。 HTTP/2的一个核心特性是…...
2 程序的灵魂—算法-2.2 简单算法举例-【例 2.3】
【例 2.3】判定 2000 — 2500 年中的每一年是否闰年,将结果输出。 润年的条件: 1. 能被 4 整除,但不能被 100 整除的年份; 2. 能被 100 整除,又能被 400 整除的年份; 设 y 为被检测的年份,则算法可表示如下…...
Python中的上下文管理器(contextlib)模块
Python中的contextlib模块提供了一些用于创建和管理上下文管理器(context managers)的工具。上下文管理器是实现了__enter__()和__exit__()方法的对象,它们通常用于确保在代码块执行前后执行某些操作,比如资源获取与释放、设置和重…...
学做缝纫的网站/网络舆情分析研判报告
install JDKInstall hadoopRun Project on Hadoop install JDK 需要提前安装好jdk和ant。 jdk是对java程序进行编译的工具(java development kid) jre:java runtime environment是提供java虚拟机的运行环境。 ant:项目管理工具…...
星沙做淘宝店铺网站/百度搜索资源管理平台
visible, disable, css绑定 这个例子非常简单,主要演示如何通过属性控制html元素的显示与否(visible),可用性(disable)以及根据属性添加相应的CSS样式。 先简单的看一段代码: <p><inpu…...
河北住房和城乡建设厅官方网站/关键词点击价格查询
作者:Baijayanta Roy来源:towardsdatascience编译&内容补充:早起Python在用python进行机器学习或者日常的数据处理中,pandas是最常用的Python库之一,熟练掌握pandas是每一个数据科学家的必备技能,本文将…...
做区块链在哪个网站/培训报名
在实际开发中,项目经理会一直强调一句话,永远不要相信客户端的数据(前端可以不用验证,但是后端必须验证)。大家同意这样的说法吧。。新端验证毋庸质疑JS验证,提高用户体验我们不得不添加一些与后端一致的验证逻辑,同样…...
超炫的网站/网络推广策划方案怎么写
1:java 的最大特点及实现原理跨平台实现原理:java首先利用文本编辑器编写java源程序,源文件的后缀名为.java;再利用编译器(javac)将程序编译为字节码文件,字节码文件的后缀名.class;…...
网站建设唐山/关键词排名优化教程
点击上方蓝色字体,选择“标星公众号”优质文章,第一时间送达关注公众号后台回复pay或mall获取实战项目资料视频新款5G手机,王者上分就是这么爽!包邮送一个!文章作者: Jitwxs 链接: https://jitwxs.cn/4135e0a9.html一、…...