博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenCV 使用 FLANN 库实现特征匹配
阅读量:6821 次
发布时间:2019-06-26

本文共 3166 字,大约阅读时间需要 10 分钟。

目标

在这篇文章中你将学到:

  • 使用  接口来执行快速高效的匹配,用的是  ( Fast Approximate Nearest Neighbor Search Library ) 算法

代码

完整代码可从这里 

/** * @file SURF_FlannMatcher * @brief SURF detector + descriptor + FLANN Matcher * @author A. Huaman */#include "opencv2/opencv_modules.hpp"#include 
#ifndef HAVE_OPENCV_NONFREEint main(int, char**){ printf("The sample requires nonfree module that is not available in your OpenCV distribution.\n"); return -1;}#else# include "opencv2/core/core.hpp"# include "opencv2/features2d/features2d.hpp"# include "opencv2/highgui/highgui.hpp"# include "opencv2/nonfree/features2d.hpp"using namespace cv;void readme();/** * @function main * @brief Main function */int main( int argc, char** argv ){ if( argc != 3 ) { readme(); return -1; } Mat img_1 = imread( argv[1], CV_LOAD_IMAGE_GRAYSCALE ); Mat img_2 = imread( argv[2], CV_LOAD_IMAGE_GRAYSCALE ); if( !img_1.data || !img_2.data ) { printf(" --(!) Error reading images \n"); return -1; } //-- Step 1: Detect the keypoints using SURF Detector int minHessian = 400; SurfFeatureDetector detector( minHessian ); std::vector
keypoints_1, keypoints_2; detector.detect( img_1, keypoints_1 ); detector.detect( img_2, keypoints_2 ); //-- Step 2: Calculate descriptors (feature vectors) SurfDescriptorExtractor extractor; Mat descriptors_1, descriptors_2; extractor.compute( img_1, keypoints_1, descriptors_1 ); extractor.compute( img_2, keypoints_2, descriptors_2 ); //-- Step 3: Matching descriptor vectors using FLANN matcher FlannBasedMatcher matcher; std::vector< DMatch > matches; matcher.match( descriptors_1, descriptors_2, matches ); double max_dist = 0; double min_dist = 100; //-- Quick calculation of max and min distances between keypoints for( int i = 0; i < descriptors_1.rows; i++ ) { double dist = matches[i].distance; if( dist < min_dist ) min_dist = dist; if( dist > max_dist ) max_dist = dist; } printf("-- Max dist : %f \n", max_dist ); printf("-- Min dist : %f \n", min_dist ); //-- Draw only "good" matches (i.e. whose distance is less than 2*min_dist, //-- or a small arbitary value ( 0.02 ) in the event that min_dist is very //-- small) //-- PS.- radiusMatch can also be used here. std::vector< DMatch > good_matches; for( int i = 0; i < descriptors_1.rows; i++ ) { if( matches[i].distance <= max(2*min_dist, 0.02) ) { good_matches.push_back( matches[i]); } } //-- Draw only "good" matches Mat img_matches; drawMatches( img_1, keypoints_1, img_2, keypoints_2, good_matches, img_matches, Scalar::all(-1), Scalar::all(-1), vector
(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS ); //-- Show detected matches imshow( "Good Matches", img_matches ); for( int i = 0; i < (int)good_matches.size(); i++ ) { printf( "-- Good Match [%d] Keypoint 1: %d -- Keypoint 2: %d \n", i, good_matches[i].queryIdx, good_matches[i].trainIdx ); } waitKey(0); return 0;}/** * @function readme */void readme(){ printf(" Usage: ./SURF_FlannMatcher
\n"); }#endif

结果

  1. 这是对首张图片进行特征检测的结果

    ../../../../_images/Featur_FlannMatcher_Result.jpg
  2. 下面是对关键点进行过滤过程中的控制台输出:

    ../../../../_images/Feature_FlannMatcher_Keypoints_Result.jpg
来源:
 [英文]

转载地址:http://yfvzl.baihongyu.com/

你可能感兴趣的文章
第12天 :布尔值和关系运算符
查看>>
Owin中间件动手做
查看>>
shell中pushd和popd
查看>>
“剪掉尾巴”的PC VR,会是VR的未来吗?
查看>>
案例推荐《中汇技术:打造银行间市场本外币交易背后的共享服务平台》
查看>>
岱凯为环法自行车赛引进机器学习技术 更深入的赛事分析使全球自行车爱好者对本届大赛了如指掌...
查看>>
varnish
查看>>
DML 触发器 注意事项
查看>>
用户自定义类型《lua程序设计》 28章 笔记
查看>>
Unity3D游戏-愤怒的小鸟游戏源码和教程(二)
查看>>
C++ 工程实践(3):采用有利于版本管理的代码格式
查看>>
bootstrap-进度条
查看>>
sql server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表 的解决办法(转)...
查看>>
HTML,CSS,font-family:中文字体的英文名称 (宋体 微软雅黑)
查看>>
Hexo类型博客集成打赏功能
查看>>
ip_forward与路由转发
查看>>
NGINX基本优化(一)
查看>>
经典-输出规律的数字序列
查看>>
MySQL存储引擎--MyISAM与InnoDB区别
查看>>
[转载]SQL语句中LEFT JOIN ON WHERE和LEFT JOIN ON AND的区别
查看>>