一步一步教你跑lct-tracker(Win10+Matlab 2016b+Visual Studio 2015)

LCT-Tracker的作者其实把代码写得超级人性化,新手对结构可能不了解,导致跑不起来。网上博客也看了很多,尝试了很多,但是一直跑不起来。问题在于作者源码使用的是OpenCV3.0.0,而我电脑里下载的是OpenCV4.0.1和3.3,测试貌似都不行,其他版本未知,3.0绝对没问题。

注意:强烈建议使用的OpenCV的版本与作者一致,使用3.0的。

步骤开始:

1、环境下载:

Visual Studio 2015:下载安装(开发人员工具-->下翻-->找到Visual Studio 2015下载安装)。安装破解教程网上有,序列号在这里,我使用专业版Professional !(注意:Matlab无法识别版本年份比自己高的Visual Studio,所以这里Matlab2016b,选择小于2016年份的Visual Studio 2015版)

OpenCV:下载安装,选择3.0.0 Win版下载,直接双击,释放,其实就是解压。

LCT-Tracker:下载项目源码解压。

VLFeat 0.9.21 :下载解压,这是一个Matlab工具包。

Jogging数据集:找到两个人在跑步的视频集下载,解压。

Long-term Correlation Tracking:作者马超大神的论文。

2、环境配置

① 添加VLFeat到Matlab路径中:不添加会报错,找不到或未定义某些函数。

这样就相当于安装了这个工具包,其他matlab工具包的安装也可以参照这个过程。 如果自己写的函数想要在matlab工程里调用的话也可参照这种方法,matlab的程序组织就是这种形式,简单粗暴。

② 解压项目和数据集

③ 编译utility

进入utility中,再在Matlab中输入mex -setup C++,再输入compile运行,或者直接打开compile.m文件运行。编译完成即可。

运行compile时又报错,是因为要修改opencv的路径,如下图,在红框处修改路径为你解压OpenCV3.0.0对应的文件夹位置,主要是include和lib文件夹。

再将OpenCV3.0安装目录下的\build\x64\vc12\bin文件夹中的三个dll文件拷贝到 utility 中,不然会报错无法加载一些文件。

④ 运行源码:

主程序是run_tracker.m,修改红框中的路径为你接下的项目目录下对应的Benchmark文件夹。

注:作者给出的download_video.m可以下载其他数据集,或者自己手动去下载也行,在代码里的网址里下载。

数据集的Jogging中有两个groundtruth,默认以其中的第一组数据为目标,进行学习跟踪。很多人都这么做的。

作者文章思路我就不讲解了,大家可以自己看或者网上找。很不错的方法,方法也有改进的,Adaptive Correlation Filters with Long-Term and Short-Term Memory for Object Tracking,在相关滤波这一块研究得非常不错。

  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是一个简单的 C++ LCT 实现,包含了 LCT 基本操作: ```cpp #include <bits/stdc++.h> using namespace std; const int N = 1e5 + 5; // 节点结构体 struct Node { int ch[2], fa, rev; int val, sum; } tr[N]; // 判断节点x是否是其父节点的左儿子 bool is_left(int x) { return tr[tr[x].fa].ch[0] == x; } // 反转标记 void reverse(int x) { swap(tr[x].ch[0], tr[x].ch[1]); tr[x].rev ^= 1; } // 维护反转标记 void pushdown(int x) { if (tr[x].rev) { reverse(tr[x].ch[0]); reverse(tr[x].ch[1]); tr[x].rev = 0; } } // 维护sum值 void pushup(int x) { tr[x].sum = tr[tr[x].ch[0]].sum + tr[tr[x].ch[1]].sum + tr[x].val; } // 旋转操作 void rotate(int x) { int y = tr[x].fa, z = tr[y].fa; int k = is_left(x), w = tr[x].ch[k ^ 1]; tr[y].ch[k] = w; tr[w].fa = y; tr[z].ch[is_left(y)] = x; tr[x].fa = z; tr[x].ch[k ^ 1] = y; tr[y].fa = x; pushup(y); pushup(x); } // 递归下传反转标记 void splay(int x) { static int stk[N]; int top = 0, y = x; stk[++top] = y; while (!stk[top]) { y = tr[y].fa; stk[++top] = y; } while (top) pushdown(stk[top--]); while (is_left(x)) { int y = tr[x].fa, z = tr[y].fa; if (is_left(y)) rotate(y); rotate(x); } while (!is_left(x)) { int y = tr[x].fa, z = tr[y].fa; if (!is_left(y)) rotate(y); rotate(x); } } // 将x节点到根节点的路径变为一条链 void access(int x) { for (int y = 0; x; y = x, x = tr[x].fa) { splay(x); tr[x].ch[1] = y; pushup(x); } } // 将x节点所在的树变为splay树的根节点 void make_root(int x) { access(x); splay(x); reverse(x); } // 查询x节点所在的树的根节点 int find_root(int x) { access(x); splay(x); while (tr[x].ch[0]) { pushdown(x); x = tr[x].ch[0]; } splay(x); return x; } // 连接x和y两个节点 void link(int x, int y) { make_root(x); tr[x].fa = y; } // 断开x和y两个节点 void cut(int x, int y) { make_root(x); if (find_root(y) == x && tr[y].fa == x && !tr[y].ch[0]) { tr[y].fa = tr[x].ch[1] = 0; pushup(x); } } // 修改x节点的值为val void modify(int x, int val) { splay(x); tr[x].val = val; pushup(x); } // 查询x节点到y节点路径上的所有节点的权值和 int query(int x, int y) { make_root(x); access(y); splay(y); return tr[y].sum; } int main() { int n, m; scanf("%d%d", &n, &m); for (int i = 1; i <= n; ++i) { scanf("%d", &tr[i].val); tr[i].sum = tr[i].val; } while (m--) { int opt, x, y; scanf("%d%d%d", &opt, &x, &y); if (opt == 0) printf("%d\n", query(x, y)); else if (opt == 1) link(x, y); else if (opt == 2) cut(x, y); else if (opt == 3) modify(x, y); } return 0; } ``` 这里只是一个简单的 LCT 实现,对于一些细节和优化并没有处理。如果需要了解更多关于 LCT 的内容,可以参考一些经典题目,如 P3834、P3836、P4219 等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值