OpoenCV BRIEF特征提取
来源:互联网 发布:股价数据中的真理 编辑:程序博客网 时间:2024/05/11 19:08
/* * matching_test.cpp * * Created on: Oct 17, 2010 * Author: ethan */#include "opencv2/core/core.hpp"#include "opencv2/calib3d/calib3d.hpp"#include "opencv2/features2d/features2d.hpp"#include "opencv2/imgproc/imgproc.hpp"#include "opencv2/highgui/highgui.hpp"#include <vector>#include <iostream>using namespace cv;using namespace std;//Copy (x,y) location of descriptor matches found from KeyPoint data structures into Point2f vectorsvoid matches2points(const vector<DMatch>& matches, const vector<KeyPoint>& kpts_train, const vector<KeyPoint>& kpts_query, vector<Point2f>& pts_train, vector<Point2f>& pts_query){ pts_train.clear(); pts_query.clear(); pts_train.reserve(matches.size()); pts_query.reserve(matches.size()); for (size_t i = 0; i < matches.size(); i++) { const DMatch& match = matches[i]; pts_query.push_back(kpts_query[match.queryIdx].pt); pts_train.push_back(kpts_train[match.trainIdx].pt); }}double match(const vector<KeyPoint>& /*kpts_train*/, const vector<KeyPoint>& /*kpts_query*/, DescriptorMatcher& matcher, const Mat& train, const Mat& query, vector<DMatch>& matches){ double t = (double)getTickCount(); matcher.match(query, train, matches); //Using features2d return ((double)getTickCount() - t) / getTickFrequency();}void help(){ cout << "This program shows how to use BRIEF descriptor to match points in features2d" << endl << "It takes in two images, finds keypoints and matches them displaying matches and final homography warped results" << endl << "Usage: " << endl << "image1 image2 " << endl << "Example: " << endl << "box.png box_in_scene.png " << endl;}const char* keys ={"{1| |box.png |the first image}""{2| |box_in_scene.png|the second image}"};int main(int argc, const char ** argv){ help(); CommandLineParser parser(argc, argv, keys); string im1_name = "/home/wdy/left01.jpg"; string im2_name = "/home/wdy/left02.jpg"; Mat im1 = imread(im1_name, CV_LOAD_IMAGE_GRAYSCALE); Mat im2 = imread(im2_name, CV_LOAD_IMAGE_GRAYSCALE); if (im1.empty() || im2.empty()) { cout << "could not open one of the images..." << endl; cout << "the cmd parameters have next current value: " << endl;parser.printParams(); return 1; } double t = (double)getTickCount(); FastFeatureDetector detector(50); BriefDescriptorExtractor extractor(32); //this is really 32 x 8 matches since they are binary matches packed into bytes vector<KeyPoint> kpts_1, kpts_2; detector.detect(im1, kpts_1); detector.detect(im2, kpts_2); t = ((double)getTickCount() - t) / getTickFrequency(); cout << "found " << kpts_1.size() << " keypoints in " << im1_name << endl << "fount " << kpts_2.size() << " keypoints in " << im2_name << endl << "took " << t << " seconds." << endl; Mat desc_1, desc_2; cout << "computing descriptors..." << endl; t = (double)getTickCount(); extractor.compute(im1, kpts_1, desc_1); extractor.compute(im2, kpts_2, desc_2); t = ((double)getTickCount() - t) / getTickFrequency(); cout << "done computing descriptors... took " << t << " seconds" << endl; //Do matching with 2 methods using features2d cout << "matching with BruteForceMatcher<HammingLUT>" << endl; BruteForceMatcher<HammingLUT> matcher; vector<DMatch> matches_lut; float lut_time = (float)match(kpts_1, kpts_2, matcher, desc_1, desc_2, matches_lut); cout << "done BruteForceMatcher<HammingLUT> matching. took " << lut_time << " seconds" << endl; cout << "matching with BruteForceMatcher<Hamming>" << endl; BruteForceMatcher<Hamming> matcher_popcount; vector<DMatch> matches_popcount; double pop_time = match(kpts_1, kpts_2, matcher_popcount, desc_1, desc_2, matches_popcount); cout << "done BruteForceMatcher<Hamming> matching. took " << pop_time << " seconds" << endl; vector<Point2f> mpts_1, mpts_2; matches2points(matches_popcount, kpts_1, kpts_2, mpts_1, mpts_2); //Extract a list of the (x,y) location of the matches vector<uchar> outlier_mask; Mat H = findHomography(mpts_2, mpts_1, RANSAC, 1, outlier_mask); Mat outimg; drawMatches(im2, kpts_2, im1, kpts_1, matches_popcount, outimg, Scalar::all(-1), Scalar::all(-1), reinterpret_cast<const vector<char>&> (outlier_mask)); imshow("matches - popcount - outliers removed", outimg); Mat warped; Mat diff; warpPerspective(im2, warped, H, im1.size()); imshow("warped", warped); absdiff(im1,warped,diff); imshow("diff", diff); waitKey(); return 0;}
可以看出
FastFeatureDetector detector(50); BriefDescriptorExtractor extractor(32); //this is really 32 x 8 matches since they are binary matches packed into bytes
提取特征点用的FAST特征
描述采用的BRIEF
- OpoenCV BRIEF特征提取
- BRIEF特征提取(理解篇)
- 各种二进制特征提取算子(ORB 、BRIEF 、 FREAK、 BRISK)
- BRIEF特征
- BRIEF特征
- 【图像特征提取6】ORB特征点的描述----BRIEF描述子
- 【图像特征提取16】BRIEF特征描述子原理及源码解析
- 图像特征点提取及描述子汇总:FIST、SURF、FAST、BRIEF、ORB、BRISK、FREAK
- BRIEF特征 学习笔记
- BRIEF 特征描述子
- BRIEF 特征描述子
- Brief特征点描述
- BRIEF特征原理
- BRIEF特征匹配
- BRIEF 特征描述子
- BRIEF特征描述子
- BRIEF特征描述子
- OpenCV中feature2D学习——FAST特征点检测与SIFT/SURF/BRIEF特征提取与匹配
- 判断一个数是否为素数
- 如何打开注册表编辑器?
- 委托 ,事件
- 如何从Web页面中获取结构化列表内容
- etf 集合
- OpoenCV BRIEF特征提取
- NSLog
- 有符号数的转换和 无符号数的转换(转)
- function object研究之八 add_value_*
- Delphi 禁用x64位系统文件重定向功能。
- 关于PHP页面显示乱码问题的解决
- 有符号数的转换和 无符号数的转换
- Shiro 设置session超时时间
- Android 实现书籍翻页效果----原理篇