光流法需要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);
只对第一个图像提取特征。然后对第一幅图像提取的特征进行追踪。
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有一个为空指针,直接从头开始执行。
2.追踪特征点
定义两个特征点形式,一个是next_keypoints,一个是prev_keypoints.一个表示之后的,一个表示先前的。都是vector<cv::Point2f>形式。
先前的特征点表示的是从之前循环得到的特征点。第一次就是提取到的所有特征点。
定义status和errot.类型分别为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,也就是说两个是相等的。
3.把跟丢的点删掉
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),这个的意思是每次循环后暂停,按任意键继续。
3.画图
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,不带引号的。

最新文章

  1. Android 自定义Dialog类,并在Activity中实现按钮监听。
  2. 那些年,在AngularJS的路上遇到的坑
  3. 阻抗计算(用SI9000如何计算微带线)
  4. 张艾迪(创始人):Hello.世界...
  5. C++动态内存分配
  6. Git分支管理详解
  7. Mybatis 一对一、一对多、多对多关联之级联添加
  8. 图形变幻矩阵 Transforms
  9. Java解析XML文档(简单实例)&mdash;&mdash;dom解析xml
  10. 基本排序算法:Python实现
  11. [TYVJ] P1026 犁田机器人
  12. tostring的用法
  13. CSS3里面的高级属性
  14. 初步swift语言学习笔记2(可选类型?和隐式可选类型!)
  15. java操作oracle的blob,clob数据
  16. 动态规划——Split Array Largest Sum
  17. C/C++中 # 的神奇作用:把宏参数字符串化/贴合宏参数
  18. NLayerAppV3--基础结构层(Cross-Cutting部分)
  19. Android学习之两款下拉刷新库分享
  20. 大数据框架-spark

热门文章

  1. Hibernate学习之单向一对多映射
  2. Hadoop 配置及hadoop HA 的配置
  3. POJ1195 Mobile phones 【二维线段树】
  4. fedora20配置静态ip
  5. [Hibernate开发之路](4)ID生成策略
  6. Hadoop-2.6.0上调用C的API实现相似云盘的功能
  7. SPI协议介绍
  8. 启用nginx报错80端口被占用
  9. android EditText控制最大输入行数
  10. mysql 与mongodb的特点与优劣