当前位置:网站首页>Opencv学习之ORB特征提取和匹配
Opencv学习之ORB特征提取和匹配
2022-08-04 12:29:00 【郑学长】
**
Opencv学习之ORB特征提取和匹配
**
编译环境:VS2017 + Opencv3.4.7
注:ORB算法是Opencv3之后才有的。
ORB特征的介绍:ORB特征是由关键点和描述子两部分组成。
提取ORB特征分为如下两个步骤:
1.FAST角点提取:FAST是一种角点,主要检测局部像素灰度变化明显的地方。找出图像中的“角点”,相较于原版的FAST,ORB中计算了特征点的主方向,为后续的BRIEF描述子增加了旋转不变特性。
2.BRIEF描述子:BRIEF是一种二进制描述子,其描述向量由许多0和1组成,需要用汉明距离度量,对提取出的特征点的周围图像区域进行描述,使用先前计算的方向信息。
特征匹配:简单的暴力匹配,对每个特征点与所有的待匹配点,测量它们描述子之间的距离,然后排序,取最近的一个作为匹配点。描述子距离表示了两个特征之间的相似程度,两个二进制串之间的汉明距离,指的是其不同位数的个数。
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <chrono>
using namespace std;
using namespace cv;
int main(int argc, char **argv)
{
//读取图像
Mat img_1 = imread("../Images/L10.jpg", CV_LOAD_IMAGE_COLOR);
Mat img_2 = imread("../Images/R10.jpg", CV_LOAD_IMAGE_COLOR);
assert(img_1.data != nullptr && img_2.data != nullptr);
//初始化
std::vector<KeyPoint> keypoints_1, keypoints_2;
Mat descriptors_1, descriptors_2;
Ptr<FeatureDetector> detector = ORB::create();
Ptr<FeatureDetector> descriptor = ORB::create();
Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce-Hamming");
//第一步,检测Oriented FAST 角点位置
chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
detector->detect(img_1, keypoints_1);
detector->detect(img_2, keypoints_2);
//第二部,根据角点位置计算BRIEF描述子
descriptor->compute(img_1, keypoints_1, descriptors_1);
descriptor->compute(img_2, keypoints_2, descriptors_2);
chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<doub``le>>(t2 - t1);
cout << "extract ORB cost = " << time_used.count() << "seconds." << endl;
Mat outimg1;
drawKeypoints(img_1, keypoints_1, outimg1, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
imshow("ORB features", outimg1);
//第三步:对两幅图像中打BRIEF描述子进行匹配,使用Hamming距离
vector<DMatch> matches;
t1 = chrono::steady_clock::now();
matcher->match(descriptors_1, descriptors_2, matches);
t2 = chrono::steady_clock::now();
time_used = chrono::duration_cast<chrono::duration<double>>(t2 - t1);
cout << "match ORB cost = " << time_used.count() << "seconds." << endl;
//第四步:匹配点对筛选 计算最小距离和最大距离
auto min_max = minmax_element(matches.begin(), matches.end(), [](const DMatch &m1, const DMatch &m2) { return m1.distance < m2.distance; });
double min_dist = min_max.first->distance;
double max_dist = min_max.second->distance;
printf("-- Max dist : &f \n", max_dist);
printf("-- Min dist : &f \n", min_dist);
//当描述子之间的距离大于两倍的最小距离时,即认为匹配有误.但有时候最小距离会非常小,设置一个经验值30作为下限.
std::vector<DMatch> good_matches;
for (int i = 0; i < descriptors_1.rows; ++i) {
if (matches[i].distance <= max(2 * min_dist, 30.0)) {
good_matches.push_back(matches[i]);
}
}
//第五步,绘制匹配结果
Mat img_match;
Mat img_goodmatch;
drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_match);
drawMatches(img_1, keypoints_1, img_2, keypoints_2, good_matches, img_goodmatch);
imshow("all matches", img_match);
imwrite("../Result/img_match_1.jpg", img_match);
imshow("good matches", img_goodmatch);
imwrite("../Result/img_goodmatch_1.jpg", img_goodmatch);
waitKey(0);
return 0;
}
边栏推荐
- "Lonely Walking on the Moon" is a powerful medicine, it can't cure the internal friction of happy twist
- 酷开科技 × StarRocks:统一 OLAP 分析引擎,全面打造数字化的 OTT 模式
- Motion Rule (16)-Union Check Basic Questions-Relations
- DateTimeFormatter api
- 用VbScript控制光驱
- Django使用腾讯云发送短信并存入redis
- Access Huawei game anti-addiction, click the anti-addiction pop-up window, the game crashes
- 项目里的各种配置,你都了解吗?
- “蔚来杯“2022牛客暑期多校训练营2 G、J、K
- 划重点!2022面试必刷461道大厂架构面试真题汇总+面经+简历模板
猜你喜欢
A comprehensive understanding of MOS tubes, an article is enough
【黑马早报】尚乘数科上市13天,市值超阿里;北大终止陈春花聘用合同;新东方花近200亿退学费和遣散费;张小泉75%产品贴牌代工...
七夕疯狂搞钱的年轻人,一周赚14万
开发小程序插件如何实现盈利?
MATLAB——图像分块
划重点!2022面试必刷461道大厂架构面试真题汇总+面经+简历模板
分布式链路追踪Jaeger + 微服务Pig在Rainbond上的实践分享
Small program on how to play in the construction of e-government service platform value
break与continue超详解!!!
Flutter使用 json_serializable 解析 JSON 最佳方案
随机推荐
来 TDengine 开发者大会,洞悉数据技术发展的未来趋势
独立站卖家如何使用 WhatsApp Business API 建立有意义的客户关系?
Flutter教程大全合集(2022年版)
两年独立开发经验程序员告诉我们赚钱的经验(听听真正赚到钱的高手做法)
论文翻译:2022_Time-Frequency Attention for Monaural Speech Enhancement
动规(18)-并查集基础题——团伙
Diffusion Models:生成扩散模型
break与continue超详解!!!
LeetCode Daily Question (858. Mirror Reflection)
num_workers
抽奖/秒杀/竞价/评分/权威/投票,技术教你用合适的方法做好活动
Django框架MySQL数据库到models模型的映射关系
面试官:连 INSERT INTO SET 都不知道怎么用,你这3年都干些什么了?
如何让 WPF 程序更好地适配 UI 自动化
新SCADA 系统:集成边缘计算、MQTT 和云平台
微信小程序使用腾讯云对象储存上传图片
5 cloud security management strategies enterprises should implement
【PHP实现微信公众平台开发—基础篇】第1章 课程介绍
飞书更新招聘功能 候选人可选择面试时间
“蔚来杯“2022牛客暑期多校训练营4 N