useLK 光流法跟踪FAST角点
执行 ./useLK ../../data 运行程序。
光流法需要include<opencv2/video/tracking.hpp>,用到列表,所以要include<list><vector>
1.读取文件
定义图像存储路径用string
string path_dataset=argv[1];
associate文件地址
string associate_file=path_dataset+"/associate.txt";
读取associate_file.
ifstream fin(associate_file);
因为associate文件的每一行分别是time_color,color,time_depth,depth.所以定义这4个路径,方便之后读取深度图和彩色图。
string rgb_file,depth_file,time_rgb,time_depth,
弄个for循环。然后把fin的每一行分别赋值。
for(int index=0;index<100;index++)
fin>>time_rgb>>rgb_file>>time_depth>>depth_file;
有路径了,就读取吧。深度图读的时候要加-1.
color=cv::read(path_dataset+"/"+rgb_file);
depth=cv::read(path_dataset+"/"+depth_file,-1);
2.对第一帧提取FAST特征点
只对第一个图像提取特征。然后对第一幅图像提取的特征进行追踪。
if(index==0)
执行
vector<cv::KeyPoint> kps;
cv::Ptr<cv::FastFeatureDetector> detector=cv::FastFeatureDector::create();
detector->detect(color,kps)
由于这里提取的kps是cv::KeyPoint形式,需要把每一个特征点都变成Point2f形式。所以
for(auto kp:kps)
keypoints.push_back(kp.pt);
这里的keypoints的类型为list<cv::Point2f>,方便之后删除。
取完特征点之后last_color=color;
中间如果color.data或者depth.date有一个为空指针,直接从头开始执行。
3.其他帧用LK光流法追踪特征点
定义两个特征点形式,一个是next_keypoints,一个是prev_keypoints.一个表示之后的,一个表示先前的。都是vector<cv::Point2f>形式。
prev_keypoints先前的特征点 表示的是从之前循环得到的特征点。第一次就是提取到的所有特征点。
定义status和error.类型分别为vector<unsiged char> 和vector<float>
把last_color,color,prev_keypoints,next_keypoints,status,error依次放到函数cv::calcOpticalFlowPyrLK函数中,可以返回next_keypoints,status,error.
如果index==1,的话,这里,last_color=color,也就是说两个是相等的。
4.把跟丢的点删掉
int i=0.
for(auto iter=keypoints.begin();iter!=keypoints.endl;i++)
如果status对应的第i个值是0,应该说明这个特征点跟丢了。那么iter=keypoints.erase(iter);
erase是擦除函数。
keypoints这里是个列表,所以begin是它的第一个元素。
如果第1个元素为0,那么iter原来是keypoints的第一个元素,Iter等于keypoints擦除iter这个元素之后的列表。然后跳到for循环,然后iter为第1个元素,但是因为keypoints的第一元素被擦除了,所以第一个元素已经换了,如果status[2]!=0,指针iter为next_keypoints[i]的第i个元素。iter+1.所以i是一直加的。
这里擦除之后,可以得到下个图还剩多少特征点。
添加了cv::waitKey(0),这个的意思是每次循环后暂停,按任意键继续。
5..画图
cv::Mat img_show=color.clone();
画的图片也是一个矩阵。
要把每一个特征点都用cv::circle表示一下。
for(auto kp:keypoints)
cv::circle(img_show,kp,10,cv::Scalar(0,240,0),1)
展示用cv::imshow就可以了。
然后last_color=color.
cv后面的函数都是第一个字母小写,换字符大写。
例如cv::calcOptical..,cv::waitKey(0)
fin直接associate_file,不带引号的。
原文:https://www.cnblogs.com/talugirl/p/7388607.html
ch8 -- useLK的更多相关文章
-
高翔《视觉SLAM十四讲》从理论到实践
目录 第1讲 前言:本书讲什么:如何使用本书: 第2讲 初始SLAM:引子-小萝卜的例子:经典视觉SLAM框架:SLAM问题的数学表述:实践-编程基础: 第3讲 三维空间刚体运动 旋转矩阵:实践-Ei ...
-
Mongodb Manual阅读笔记:CH8 复制集
8 复制 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔 ...
-
[Database.System.Concepts(6th.Edition.2010)].Abraham.Silberschatz. Ch8学习笔记
Database Ch8.relational design 8.1 features of good design 8.1.1 larger alternatives why design is g ...
-
linux 私房菜 CH8 linux 磁盘与文件系统管理
索引式文件系统 superblock 记录此系统的整体信息,包括 inode/block 的总量.使用量.剩余量,以及文件系统的格式与相关信息等: inode 记录档案的属性,一个档案占用一个 ino ...
-
[HDFS Manual] CH8 HDFS Snapshots
HDFS Snapshots HDFS Snapshots 1. 概述 1.1 Snapshottable目录 1.2 快照路径 2. 带快照的更新 3. 快照操作 3.1 管理操作 3.2 用户操作 ...
-
【学习笔记】Learning OpenCV3——Ch8 working with video
Reading Video with the cv::VideoCapture Object 对象创建的三种方法: // 1. Input filename cv::VideoCapture::Vid ...
-
ch8 -- directMethod
稀疏直接法 主要用的g2o的方法.自己定义了一个新的一元边.边的误差项是测量值和由估计得来的x,y对应的灰度值之间的误差.导数为灰度对像素坐标的导数乘以像素坐标对yi*李代数的导数的负数.灰度对于像素 ...
-
【读书笔记】构建之法(CH7~CH8)
MSF九大原则: 1. 推动信息共享与沟通:“谐”,Alert 2. 为共同的远景而工作:目标明确—用户/老板 3. 充分授权和信任: 4. 各司其职,对项目共同负责: 5. 交付增量的价值: 6. ...
-
Core java for impatient 笔记 ch8 流
流stream 使用了数据视图,让你可以在比集合更高的概念上指定操作使用流,你只需要将操作的调度留给实现,例如,假设你要计算某个属性的平均值,你只需要指定数据源和属性,然后流类库会优化计算,比如使用多 ...
随机推荐
-
chrome经常崩溃解决过程
之前chrome常崩溃,也没有找到原因,就将就着用吧,一直用到今天,今天连续几次崩了,突然想到,难道是因为我访问的域名没有解析(能想到这个,是因为今天分配公司域名测试的时候常输错),于是就输入一个不存 ...
-
u-boot-2010.09移植(A)
第一阶段 1.开发环境 系统:centOS6.5 linux版本:2.6.32 交叉编译器:buildroot-2012.08 以上工具已经准备好,具体安装步骤不再 ...
-
elasticsearch入门
到 https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.6.0.zip 下载最新包: 启动: ./elast ...
-
【转】Android横竖屏切换问题
Android横竖屏切换总结(Android资料) Android横竖屏要解决的问题应该就两个: 一.布局问题 二.重新载入问题 1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的 ...
-
微软Azure云主机测试报告
http://www.cnblogs.com/sennly/p/4135658.html 1. 测试目的 本次测试的目的在于对微软云主机做性能测试,评估其是否能够满足我们业务的需求. 2. 测试项目 ...
-
在Azure Cloud Service中部署Java Web App(2)
接上文. 9.在进行发布之前,需要对我们的订阅做一些设置,因为默认情况下,Azure的service end指向的是Azure global的站点,如果我们要将服务发布在Azure的中国站点,需要做下 ...
-
[转]svn提交自动同步到web服务器
参考博文:http://my.oschina.net/wddqing/blog/201567 同步程序思路:用户提交程序到SVN,SVN触发hooks,按不同的hooks进行处理,这里用到的是post ...
-
Linux系统手动安装rpm包依赖关系分析(以Kernel升级为例)
有在Linux系统中安装软件的经历的人都知道,在Linux系统中手动安装软件不想在Windows下安装软件那么方便,直接双击,然后下一步下一步就可以把软件成功的装入到系统中,而在Linux系统中,安装 ...
-
Ansible系列(七):执行过程分析、异步模式和速度优化
本文目录:1.1 ansible执行过程分析1.2 ansible并发和异步1.3 ansible的-t选项妙用1.4 优化ansible速度 1.4.1 设置ansible开启ssh长连接 1.4. ...
- 【MySQL】查看支持的引擎show engines;