3、opencv特征的提取与配准 keypoint and match

来源:互联网 发布:java程序设计培训班 编辑:程序博客网 时间:2024/05/21 22:28

(在做高博的“一起做RGB-D_SLAM”的一些问题,作为自己笔记总结,以督促自己完成并理解)
有点不太想做下去这个,幸好可以写写,哈哈,刷刷成就感
这次做的一起做----特征的提取与配准,前面先有库的封装,不是太明白,这个知识点先放这,后面再补充???

步骤:在qt里直接新建include/slamBase.h不会,就在终端进入项目路径下新建的。
特征提取
keypoints
特征配准
特征配准
通过距离筛选优化
筛选优化
计算图像间的运动关系R\t,优化存在误匹配的情况
误匹配优化
接着试着用自己无深度的照片(三幅图放一起了)
无深度的

note:
1. OpenCV提供了两种Matching方式:
• Brute-force matcher (cv::BFMatcher)
• Flann-based matcher (cv::FlannBasedMatcher)
Brute-force matcher就是用暴力方法找到点集一中每个descriptor在点集二中距离最近的descriptor;

    vector< cv::DMatch > matches;    cv::BFMatcher matcher;                                   //Matching方式:用暴力方法找到点集一中每个descriptor在点集二中距离最近的descriptor    matcher.match( desp1, desp2, matches );               //对上述的描述子进行匹配    cout<<"Find total "<<matches.size()<<" matches."<<endl;  //

Flann-based matcher 使用快速近似最近邻搜索算法寻找(用快速的第三方库近似最近邻搜索算法)
一般把点集一称为 train set (训练集)对应模板图像,点集二称为 query set(查询集)对应查找模板图的目标图像。
为了提高检测速度,你可以调用matching函数前,先训练一个matcher。训练过程可以首先使用cv::FlannBasedMatcher来优化,为descriptor建立索引树,这种操作将在匹配大量数据时发挥巨大作用(比如在上百幅图像的数据集中查找匹配图像)。而Brute-force matcher在这个过程并不进行操作,它只是将train descriptors保存在内存中。
2. 在matching过程中可以使用cv::DescriptorMatcher的如下功能来进行匹配:
简单查找最优匹配:void match(const Mat& queryDescriptors, vector& matches,const vector& masks=vector() );
为每个descriptor查找K-nearest-matches:void knnMatch(const Mat& queryDescriptors, vector

原创粉丝点击