opencv sift match
2016-05-07 23:10
344 查看
#include "opencvlib.h" using namespace cv; int main() { Mat img_1 = cv::imread("1.png"); Mat img_2 = cv::imread("2.png"); imshow("img1", img_1); imshow("img2", img_2); if (!img_1.data || !img_2.data) { std::cout << " --(!) Error reading images " << std::endl; return -1; } //-- Step 1: Detect the keypoints using SURF Detector int minHessian = 400; SurfFeatureDetector detector(minHessian); std::vector<KeyPoint> keypoints_1, keypoints_2; detector.detect(img_1, keypoints_1); detector.detect(img_2, keypoints_2); //-- Step 2: Calculate descriptors (feature vectors) SiftDescriptorExtractor extractor; //SurfDescriptorExtractor 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 = 1000; //-- 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 ) //-- 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 < 2 * min_dist) { 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<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); //-- Show detected matches imshow("Good Matches", img_matches); imwrite("matchs.jpg", img_matches); for (int i = 0; i < 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); system("pause"); return 0; }
result
相关文章推荐
- 初窥Linux 之 我最常用的20条命令
- 搜索引擎不抓取的网站内容大纲
- Hadoop--倒排索引过程详解
- 《Apache Kafka》学习笔记
- docker pull命令解析
- linux常用基本命令
- /usr/local/nginx/sbin/nginx: error while loading shared libraries: libpcre.so.1
- @CentOS下安装Nginx
- linux配置防火墙详细步骤(iptables命令使用方法)
- 初识linux
- 【Linux学习笔记】关于ubuntu开机菜单栏和任务栏不见了的有效解决方法
- 【Linux学习笔记】关于ubuntu开机菜单栏和任务栏不见了的有效解决方法
- Netstat 的10个基本用法
- ZOJ 3941 Kpop Music Party 贪心
- 20150309+Linux+LAMP安装-02
- 03-nginx负载均衡
- 20150309+Linux+LAMP安装-01
- Linux防火墙iptables简明教程
- linux网卡绑定 网卡bond
- 你很有可能在滥用Docker