当前位置:网站首页>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;
}
边栏推荐
猜你喜欢

Nacos手摸手教学【二】Nacos注册中心

Hands-on Deep Learning_LeNet

什么是 DevOps?看这一篇就够了!

Small program on how to play in the construction of e-government service platform value

WPF---Grid布局讲解

Neck modules of the yolo series

博云入选 Gartner 中国 DevOps 代表厂商

RobotFramework二次开发(一)

接入华为游戏防沉迷,点击防沉迷弹窗后游戏闪退

【PHP实现微信公众平台开发—基础篇】第2章 微信公众账号及申请流程详解
随机推荐
项目里的各种配置,你都了解吗?
“蔚来杯“2022牛客暑期多校训练营2 G、J、K
正则表达式
云原生Devops 的实现方法
Shell loop statement (for, while, until)
Yolov5 test and train own dataset
matlab串口读写
Hit the interview!The latest interview booklet of Ali Jin, nine silver and ten is stable!
动规(16)-并查集基础题——格子游戏
【黑马早报】尚乘数科上市13天,市值超阿里;北大终止陈春花聘用合同;新东方花近200亿退学费和遣散费;张小泉75%产品贴牌代工...
如何让 WPF 程序更好地适配 UI 自动化
LeetCode每日一题(858. Mirror Reflection)
RobotFramework二次开发(一)
拥有一台服务器,程序猿装X的开始
他是“中台”之父,凭一个概念为阿里狂赚百亿
COMSOL空气反应 模型框架
Chinese valentine's day of young people crazy to make money, earn 140000 a week
大神们都在用的神器,你和大神只差一个它!!
num_workers
Analysis and comparison of mobile cross-end technical solutions