opencv ORB特征匹配
Posted qianbo_insist
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv ORB特征匹配相关的知识,希望对你有一定的参考价值。
AKAZE 局部特征匹配
级联分类器使用
等比例缩放图片
给图片加logo
鱼眼校正
智能答卷识别
opencv滤镜效果
灰度图像增强方式
opencv模板匹配
基础知识点
ORB 算法 使用 FAST detector 和 BRIEF descriptor 的思路。下面对 FAST 与 BRIEF 进行说明。
1.1 FAST(Featrues from Accelerated Segment Test)
其基本思想是比较当前点与周边点差异,当周边有连续不少于一半的点均比中间点亮或者暗,则认为该点为一个特征点。
1.2 BRIEF
BRIEF 对特征点生成描述特征向量。在 SIFT 与 SURF 中均使用了块特征描述方案,
使用不同小块的方向梯度直方图构成特征向量。BRIEF 使用点特征描述特征点
现在找两个相似的图,但是角度不同
可以看出两幅图片偏离了一定的角度,时间不同,角度不同,找特征点使用以下封装
根据角点位置计算 BRIEF 描述子,
orb->compute(img1, keypoints1, descriptors1);
结果
show me the code
#include <iostream>
#include <unordered_map>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
#ifdef _DEBUG
#pragma comment(lib,"opencv_world440d.lib")
#else
#pragma comment(lib,"opencv_world440.lib")
#endif
int main()
{
Mat img1 = imread("./big.jpg", 1);
Mat img2 = imread("./big2.jpg", 1);
std::vector<KeyPoint> keypoints1, keypoints2; // 定义关键点(特征点)
//定义描述子
Mat descriptors1, descriptors2;
Ptr<ORB> orb = ORB::create();
//提取特征点
orb->detect(img1, keypoints1);
orb->detect(img2, keypoints2);
//根据两幅图像的角点位置计算描述符
orb->compute(img1, keypoints1, descriptors1);
orb->compute(img2, keypoints2, descriptors2);
vector<DMatch> matches;
//找寻距离最小的匹配
BFMatcher bfmatcher(NORM_HAMMING, true);
bfmatcher.match(descriptors1, descriptors2, matches);
// 匹配对筛选:选择 hamming距离小于最小距离的两倍的特征点
double min_dist = 1000, max_dist = 0;
// 找出所有匹配之间的最大值和最小值
for (int i = 0; i < matches.size();i++)
{
double dist = matches[i].distance;
if (dist < min_dist)
min_dist = dist;
if (dist > max_dist)
max_dist = dist;
}
//查找相关匹配
vector<DMatch> is_matches;
for (int i = 0; i < matches.size(); i++)
{
if (matches[i].distance <= max(2 * min_dist, 30.0))
is_matches.push_back(matches[i]);
}
// 绘制匹配结果
Mat result;
drawMatches(img1, keypoints1, img2, keypoints2, is_matches, result);
imshow("匹配点对", result);
cv::waitKey(0);
return 0;
}
以上是关于opencv ORB特征匹配的主要内容,如果未能解决你的问题,请参考以下文章