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 使用点特征描述特征点,基本思想

现在找两个相似的图,但是角度不同
opencv ORB特征匹配
opencv ORB特征匹配
可以看出两幅图片偏离了一定的角度,时间不同,角度不同,找特征点使用以下封装

根据角点位置计算 BRIEF 描述子,
orb->compute(img1, keypoints1, descriptors1);

结果

opencv ORB特征匹配

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;
}
上一篇:c# – Gecko 2.0的GeckoFX更新?


下一篇:java-基于不同服务构建请求的最佳方法/模式