opencv3/C++ 使用Tracker进行简单目标跟踪

2023-05-16

简介

  • MIL: TrackerMIL 以在线方式训练分类器将对象与背景分离;多实例学习避免鲁棒跟踪的漂移问题.
  • OLB: TrackerBoosting 基于AdaBoost算法的在线实时对象跟踪.分类器在更新步骤中使用周围背景作为反例以避免漂移问题.
  • MedianFlow: TrackerMedianFlow 跟踪器适用于非常平滑和可预测的运动,物体在整个序列中可见.
  • TLD: TrackerTLD 将长期跟踪任务分解为跟踪,学习和检测.跟踪器在帧之间跟踪对象.探测器本地化所观察到的所有外观,并在必要时纠正跟踪器.学习估计检测器的错误并进行更新以避免再出现这些错误.追踪器能够处理快速运动,部分遮挡,物体缺失等情况.
  • KCF: TrackerKCF 使用目标周围区域的循环矩阵采集正负样本,利用脊回归训练目标检测器,并成功的利用循环矩阵在傅里叶空间可对角化的性质将矩阵的运算转化为向量的Hadamad积,即元素的点乘,大大降低了运算量,提高了运算速度,使算法满足实时性要求.

部分相关API:

TrackerMIL
  static Ptr<TrackerMIL> create(const TrackerMIL::Params &parameters);
  CV_WRAP static Ptr<TrackerMIL> create();
struct CV_EXPORTS Params
  {
    PARAMS();
     //采样器的参数
     float samplerInitInRadius; //初始收集正面实例的半径
     int samplerInitMaxNegNum; //初始使用负样本
     float samplerSearchWinSize; //搜索窗口的大小
     float samplerTrackInRadius; //在跟踪期间收集正面实例的半径
     int samplerTrackMaxPosNum; //在追踪期间使用正面样本
     int samplerTrackMaxNegNum; //在跟踪期间使用的负样本
     int featureSetNumFeatures; //特征

     void read(const FileNode&fn);
     void write(FileStorage&fs)const;
  };
TrackerBoosting
  static Ptr<TrackerBoosting> create(const TrackerBoosting::Params &parameters);
  CV_WRAP static Ptr<TrackerBoosting> create();
  struct CV_EXPORTS Params
{
    PARAMS();
     int numClassifiers; //在OnlineBoosting算法中使用的分类器的数量
     float samplerOverlap; //搜索区域参数
     float samplerSearchFactor; //搜索区域参数
     int iterationInit; //初始迭代
     int featureSetNumFeatures; //特征
    //从文件读取参数
     void read(const FileNode&fn);
    //从文件写入参数
     void write(FileStorage&fs)const;
  };

示例

首先获取视频的第一帧,通过点击左键框选选择要跟踪的目标,点击右键确认并使用MIL开始跟踪.(从实际情况看来,算法对过程中有遮挡的情况跟踪能力较差.)

(环境:Ubuntu16.04+QT5.8+opencv3.3.1)

#include <opencv2/opencv.hpp>
#include <opencv2/video.hpp>
#include <opencv2/tracking.hpp>
#include <opencv2/tracking/tracker.hpp>

using namespace cv;

void draw_rectangle(int event, int x, int y, int flags, void*);
Mat firstFrame;
Point previousPoint, currentPoint;
Rect2d bbox;
int main(int argc, char *argv[])
{
    VideoCapture capture;
    Mat frame;
    frame = capture.open("/home/w/mycode/QT/img/runners.avi");
    if(!capture.isOpened())
    {
        printf("can not open ...\n");
        return -1;
    }
    //获取视频的第一帧,并框选目标
    capture.read(firstFrame);
    if(!firstFrame.empty())
    {
        namedWindow("output", WINDOW_AUTOSIZE);
        imshow("output", firstFrame);
        setMouseCallback("output", draw_rectangle, 0);
        waitKey();
    }
    //使用TrackerMIL跟踪
    Ptr<TrackerMIL> tracker= TrackerMIL::create();
    //Ptr<TrackerTLD> tracker= TrackerTLD::create();
    //Ptr<TrackerKCF> tracker = TrackerKCF::create();
    //Ptr<TrackerMedianFlow> tracker = TrackerMedianFlow::create();
    //Ptr<TrackerBoosting> tracker= TrackerBoosting::create();
    capture.read(frame);
    tracker->init(frame,bbox);
    namedWindow("output", WINDOW_AUTOSIZE);
    while (capture.read(frame))
    {
        tracker->update(frame,bbox);
        rectangle(frame,bbox, Scalar(255, 0, 0), 2, 1);
        imshow("output", frame);
        if(waitKey(20)=='q')
        return 0;
    }
    capture.release();
    destroyWindow("output");
    return 0;
}

//框选目标
void draw_rectangle(int event, int x, int y, int flags, void*)
{
    if (event == EVENT_LBUTTONDOWN)
    {
        previousPoint = Point(x, y);
    }
    else if (event == EVENT_MOUSEMOVE && (flags&EVENT_FLAG_LBUTTON))
    {
        Mat tmp;
        firstFrame.copyTo(tmp);
        currentPoint = Point(x, y);
        rectangle(tmp, previousPoint, currentPoint, Scalar(0, 255, 0, 0), 1, 8, 0);
        imshow("output", tmp);
    }
    else if (event == EVENT_LBUTTONUP)
    {
        bbox.x = previousPoint.x;
        bbox.y = previousPoint.y;
        bbox.width = abs(previousPoint.x-currentPoint.x);
        bbox.height =  abs(previousPoint.y-currentPoint.y);
    }
    else if (event == EVENT_RBUTTONUP)
    {
        destroyWindow("output");
    }
}

这里写图片描述

框选目标:
这里写图片描述
跟踪效果:
这里写图片描述
这里写图片描述
这里写图片描述

实验对比发现:KCF速度最快,MedianFlow的速度也较快,对于无遮挡情况跟踪效果较好;TLD对部分遮挡处理的效果最好,处理时间相对较慢.

部分遮挡处理效果

MIL对部分遮挡的处理效果:
这里写图片描述
KCF对部分遮挡的处理效果:
这里写图片描述
TLD对部分遮挡的处理效果:
这里写图片描述


opencv::Tracker Algorithms

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

opencv3/C++ 使用Tracker进行简单目标跟踪 的相关文章

随机推荐

  • 详细图解哈夫曼Huffman编码树

    1 引言 哈夫曼 xff08 Huffman xff09 编码算法是基于二叉树构建编码压缩结构的 xff0c 它是数据压缩中经典的一种算法 算法根据文本字符出现的频率 xff0c 重新对字符进行编码 因为为了缩短编码的长度 xff0c 我们
  • matlab生成随机数的rand、randi和randn三种形式

    matlab中关于随机数的产生有3种库函数 xff0c 下面我们来看看它们的形式 xff1a 1 rand 它是生成0 1之间 xff08 开环 xff0c 不包含0和1两个数 xff09 均匀分布的伪随机数 xff0c 也就是无穷次试验其
  • Linux解压tar.gz和tar.bz2的命令

    两者的命令主要是参数的不同 xff0c 解压tar gz和tar bz2不同压缩文件的命令如下 xff1a 1 解压tar gz文件 tar zxvf span class hljs preprocessor tar span span c
  • C/C++枚举enum分别打印输出枚举子和枚举值的方法

    关于枚举枚举的基础概念我这里不再介绍 xff0c 感兴趣的同学可以查阅另一篇博文C C 43 43 中枚举类型enum使用 这里我主要提一下在调试一个大型程序中遇到日志打印中一个关于枚举输出的小错误 我们知道枚举分为枚举子和枚举值 xff0
  • C++程序抛出异常后执行顺序

    1 析构函数中是否可以抛出异常 首先我们看一个常见的问题 xff0c 析构函数中是否可以抛出异常 答案是C 43 43 标准指明析构函数不能 也不应该抛出异常 xff01 C 43 43 异常处理模型是为C 43 43 语言量身设计的 xf
  • Go语言变量的生命周期

    1 变量的生命周期 生命周期是指程序执行过程中变量存在的时间段 下面我们分别来看看包变量 xff08 全局变量 xff09 和局部变量两种变量的生命周期 包变量一直常驻在内存到程序的结束 xff0c 然后被系统垃圾回收器回收 也就是说包变量
  • Linux下修改gcc和g++的版本

    xff11 前言 最近 xff0c 自己在linux调试matlab的mex的时候 xff0c 突然发现matlab R2015版本对应的mex适配环境是gcc 4 7 xff0c 而自己ubuntu的Linux对应版本默认却是gcc 4
  • ubuntu配置安装Qt4.8.4 同时配置openssl和QtWebkit

    ubuntu配置安装Qt4 8 4 这里要说明的几点 xff0c 首先项目中要用到openssl支持的在配置Qt环境时首先要安装配置openssl xff1b 其次如果要用到Qt的QtWebkit的一定要主要在配置中一定要有配置这个模块 Q
  • error LNK1104: 无法打开文件“kernel32.lib”错误 Visual Studio 2017解决办法

    出现这种情况可能是在x86下或者x64下 解决办法 视图 gt 其他窗口 gt 属性管理器 xff08 这里默认所有项目都存在该问题 xff0c 对所有vs属性设置进行调整 xff09 可以看到其中有Win32 xff08 即为x86 xf
  • 【算法】冒泡排序

    冒泡排序 假设 xff0c 有一个数组初始状态为 2 xff0c 5 xff0c 8 xff0c 4 xff0c 3 xff0c 1 下面给出排序的过程 xff1a 程序代码 xff1a public class BubbleSortCla
  • PowerMock使用问题及方案个人总结帖

    最近一直有使用PowerMock进行测试 很方便 xff0c 但是当待测试方法的调用情况比较复杂的时候 xff0c 往往不知道怎么处理 在这里把自己的解决方法整理一下做个备份 直接以问题 解决方法的方式 1 PowerMock mock 静
  • vs默认设置代码文件保存为UTF-8

    VS这小娘们儿时不时地犯神经 xff0c 碰到了免不了腹诽一下微软那个产品经理 xff08 虽然我很希望和他做同事 xff09 xff0c 比如你加个中文注释 xff0c 就会因为文件编码保存格式不支持而编译出错 于是又找度娘求奶 xff0
  • iOS 设置圆角

    第一种方式 xff1a 通过设置控件的layer属性 该方法是iOS实现圆角的方法中最简单的一种 xff0c 比较影响性能 实现代码如下所示 xff1a UIImageView imageView 61 UIImageView alloc
  • 解决Windows下cmder中使用babun运行conda命令报错TypeError: LoadLibrary() argument 1 must be str, not None

    问题起因 众所周知 xff0c 在Windows系统下使用cmd命令行对用惯了Linux命令的人来说有诸多不便 xff0c 还好有cmder这个软件 xff0c 让在win中使用Linux命令行成为可能 同时之前配置了Babun作为cmde
  • 学习笔记 | 2023 ICLR ParetoGNN 多任务自监督图神经网络实现更强的任务泛化

    文章目录 一 论文关键信息 二 主要内容 1 Motivations 2 Insights 3 解决方案的关键 三 总结 CSDN 叶庭云 https yetingyun blog csdn net 一 论文关键信息 论文标题 Multi
  • 人工智能原理复习 | 归结原理

    文章目录 一 前言 二 主要内容 CSDN 叶庭云 https yetingyun blog csdn net 一 前言 课前思考 复习数理逻辑 明白命题逻辑 一阶谓词逻辑的基本概念 熟练谓词演算 会求谓词公式的前束范式和 Skolem 标
  • 学习笔记 | 特征和实例联合选择:强化学习视角

    文章目录 一 前言 二 基础概念 三 主要内容 1 Motivations 2 解决方案的关键 四 总结与讨论 CSDN 叶庭云 https yetingyun blog csdn net 一 前言 论文标题 Feature and Ins
  • 学习笔记 | 用距离之距离(DoD)变换改进高维数据可视化

    文章目录 一 论文关键信息 二 主要内容 三 总结 CSDN 叶庭云 https yetingyun blog csdn net 一 论文关键信息 论文标题 Improved visualization of high dimensiona
  • AI 应用研究 “淹没” 基础研究现象明显,应加强人工智能机器学习的基础研究

    文章目录 一 前言二 主要内容三 总结 一 前言 从下棋的 AlphaGo 到预测蛋白质结构的 AlphaFold xff0c 从画画的 DALL E 2 到聊天的 ChatGPT xff0c 这些或曾红极一时 xff0c 或正风头正盛的
  • opencv3/C++ 使用Tracker进行简单目标跟踪

    简介 MIL TrackerMIL 以在线方式训练分类器将对象与背景分离 多实例学习避免鲁棒跟踪的漂移问题 OLB TrackerBoosting 基于AdaBoost算法的在线实时对象跟踪 分类器在更新步骤中使用周围背景作为反例以避免漂移