OpenCV入门 - 关键点描述子匹配Flann-based

和前面利用暴力法找距离最近的descriptor,Flann-based matcher使用快速近似最近邻搜索算法,在匹配前可以利用图片训练该matcher,从而加快检测速度(TODO).

What is it Flann? FLANN is a library for performing fast approximate nearest neighbor searches in high dimensional spaces. It contains a collection of algorithms we found to work best for nearest neighbor search and a system for automatically choosing the
best algorithm and optimum parameters depending on the dataset.

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/nonfree/features2d.hpp> //

#include <iostream>
using namespace cv;
using namespace std;

int main(int argc, const char *argv[]){
    Mat car1 = imread("car1.jpeg", 0);// load as grayscale
    Mat car2 = imread("car2.jpeg", 0);
    //cv::resize(car1,car1,car2.size());

    SiftFeatureDetector detector;
    vector<KeyPoint> keypoints1, keypoints2;
    detector.detect(car1, keypoints1);
    detector.detect(car2, keypoints2);
    cout << "# keypoints of car1 :" << keypoints1.size() << endl;
    cout << "# keypoints of car2 :" << keypoints2.size() << endl;

    Mat descriptors1,descriptors2;
    Ptr<DescriptorExtractor> extractor = DescriptorExtractor::create("SIFT");
    extractor->compute(car1,keypoints1,descriptors1);
    extractor->compute(car2,keypoints2,descriptors2);

    FlannBasedMatcher matcher;
    vector<DMatch> matches;
    matcher.match(descriptors1, descriptors2, matches);
    cout << "# matches : " << matches.size() << endl;

    //calc max and min keypoints distance
    double maxdist=0, mindist=100;
    for(int i=0;i<descriptors1.rows;i++){
        double dist = matches[i].distance;
        //cout << "test" << dist << endl;
        if(dist<mindist)
            mindist = dist;
        if(dist > maxdist)
            maxdist = dist;
    }
    cout << "Max distance:" << maxdist << "Min distance:" << mindist << endl;
    // Get good matches (? distance is lesss than 2*min)
    vector<DMatch> goods;
    for(int i=0;i<descriptors1.rows;i++){
        if(matches[i].distance < 2*mindist)
            goods.push_back(matches[i]);
    }
    cout << "# good matches : " << goods.size() << endl;

    // show it on an image
    Mat output;
    drawMatches(car1, keypoints1, car2, keypoints2,
            goods, output, Scalar::all(-1), Scalar::all(-1),
            vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
    imshow("good matches result",output);
    waitKey(0);

    return 0;
}

运行结果,可看到经过滤后匹配数目大大减少。

参考:

1. Flann主页 http://www.cs.ubc.ca/research/flann/

2. Fast Approximate Nearest Neighbor Search

时间: 2024-10-19 01:01:18

OpenCV入门 - 关键点描述子匹配Flann-based的相关文章

OpenCV入门 - 关键点描述子匹配Brute-force

对图片提取特征向量之后进行keypoint descriptors matching,从而可以判断特定图像与训练集中图片的匹配程度,BFMatcher暴力匹配类继承自抽象类DescriptorMatcher,"Brute-force descriptor matcher. For each descriptor in the first set, this matcher finds the closest descriptor in the second set by trying each

BRIEF描述子生成算法

学习OpenCV关注微信公众号[OpenCV学堂] 一:介绍 我们知道SIFT算法通常通过对每个关键点生成128个特征向量作为描述子.SURF算法通常对关键点生成最少64个特征向量作为描述子.但是对于图像来说创建上千或者上万个这样的描述子内存开销比较大,运行速度受到严重影响.特别对嵌入式设备与一定设备来说,内存限制尤为明显,而且匹配的时候计算也比较耗时. 但是实际上这些特征数据OpenCV在匹配的时候并没有完全利用上,而是通过PCA.LDA等方法对它进行压缩,或者是LSH(局部敏感哈希)方法把这

【OpenCV入门教程之十八】OpenCV仿射变换 &amp; SURF特征点描述合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/33320997 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 本篇文章中,我们一起探讨了OpenCV中

OpenCV之特征检测器(Feature Detector),描述子提取器(Descriptor Extractor)和描述子匹配器(Descriptor Matcher)

1.特征检测子 -Harris cv::cornerHarris(image,strength,3,3,0.01); -Fast cv::Ptr<cv::FastFeatureDetector> fast = cv::FastFeatureDetector::create(); //或 cv::FAST(InputArray image, std::vector<KeyPoint> &keypoints, int threshold) //或 cv::FAST(InputA

【特征匹配】BRIEF特征描述子原理及源码解析

相关:Fast原理及源码解析 Harris原理及源码解析 SIFT原理及源码解析 SURF原理及源码解析 转载请注明出处: http://blog.csdn.net/luoshixian099/article/details/48338273 传统的特征点描述子如SIFT,SURF描述子,每个特征点采用128维(SIFT)或者64维(SURF)向量去描述,每个维度上占用4字节,SIFT需要128×4=512字节内存,SURF则需要256字节.如果对于内存资源有限的情况下,这种描述子方法显然不适应

【OpenCV】SIFT原理与源码分析:关键点描述

<SIFT原理与源码分析>系列文章索引:http://www.cnblogs.com/tianyalu/p/5467813.html 由前一篇<方向赋值>,为找到的关键点即SIFT特征点赋了值,包含位置.尺度和方向的信息.接下来的步骤是关键点描述,即用用一组向量将这个关键点描述出来,这个描述子不但包括关键点,也包括关键点周围对其有贡献的像素点.用来作为目标匹配的依据(所以描述子应该有较高的独特性,以保证匹配率),也可使关键点具有更多的不变特性,如光照变化.3D视点变化等. SIFT

OpenCV 入门教程 之环境配置 + 图片匹配 matchTemplate

1.什么是OpenCV OpenCV的全称是:Open Source Computer Vision Library.OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和Mac OS操作系统上.它轻量级而且高效--由一系列 C 函数和少量 C++ 类构成. 总结特点: 1.开源, 商业用途也不必公开自己的源代码或者改善后的代码. 2.效率高,简单的图像处理就算了,涉及到复杂的处理一般的类库无法满足比如CXImage 3.有巨头维护(Intel) 有这三个

OpenCV入门

此系列文章只是OpenCV tutorials的学习和总结. 网址:http://docs.opencv.org/doc/tutorials/tutorials.html 基础OpenCV入门包括以下内容: OpenCV介绍---------------------------------学习如何安装OpenCV. core模块,核心功能---------------------------学习基础模块,操作图像等. imgproc模块,图像处理-----------------------学习

OpenCV入门教程之九 特征点检测与图像匹配

特征点又称兴趣点.关键点,它是在图像中突出且具有代表意义的一些点,通过这些点我们可以用来识别图像.进行图像配准.进行3D重建等.本文主要介绍OpenCV中几种定位与表示关键点的函数. 一.Harris角点 角点是图像中最基本的一种关键点,它是由图像中一些几何结构的关节点构成,很多都是线条之间产生的交点.Harris角点是一类比较经典的角点类型,它的基本原理是计算图像中每点与周围点变化率的平均值.  (1)  (2) 其中I(x+u,y+u)代表了点(x,y)邻域点的灰度值.通过变换可以将上式变化