FLANN特征匹配

FLANN特征匹配

特征的概念:

  • 一个图像块是由相似平面组成,其在原图像中会有大量相同的区域。
  • 一个图像块取自原图像的边缘,其具有横向或纵向的差异性,而在与该方向垂直的角度上相同。
  • 一个图像块取自原图像的角点,其具有移动后的不同性。…[其它具有不同特点的图像块]
    好的图像特征应具有唯一性,即选取该图像周围的一块区域进行移动,其视觉印象会不同

图像的特征工程:

  1. 特征提取:寻找易于追踪和对比的特征————在图像所有区域中寻找向周围少量移动时变化最大的图像块————将这种操作映射到计算机语言中。
  2. 特征描述:对提取的特征[特征周围的区域]用计算机的语言进行描述,使得其能够在其它图像中寻找到相似区域。
  3. 特征匹配:根据特征描述,在其它图像中寻找所有相同的特征区域,以便进行需求的操作[如排列,整合等]。

FLANN:
FLANN是一种高效的数值或者字符串匹配算法,SIFT/SURF是基于浮点数的匹配,ORB是二值匹配,速度更快。对于FLANN匹配算法,当使用ORB匹配算法的时候,需要重新构造HASH。这个在C++的代码种做了演示。对匹配之后的输出结果,根据距离进行排序,就会得到距离比较的匹配点

例图:
在这里插入图片描述
例子:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <cmath>

const float  RATIO = 0.4;


using namespace cv;
using namespace std;

int main(int argc, char** argv) {

	Mat box = imread("E:/opencv/box.png");
	Mat scene = imread("E:/opencv/box_in_scene.png");

	if (!box.data || !scene.data) {
		cout << "没有找到图片" << endl;
		return -1;
	}
	imshow("box ", box);
	imshow("box_in_scene", scene);

	//创建关键点集变量
	vector<KeyPoint> kpt_obj, kpt_sence;
	//描述子
	Mat descriptors_box, descriptors_sence;

	//计算描述符(特征向量)
	Ptr<ORB> detector = ORB::create();

	//检测
	detector->detectAndCompute(scene, Mat(), kpt_sence, descriptors_sence);
	detector->detectAndCompute(box, Mat(), kpt_obj, descriptors_box);

	vector<DMatch> matches;
	//基于FLANN的描述符对象匹配
	Ptr<DescriptorMatcher> matcher = makePtr<FlannBasedMatcher>(makePtr<flann::LshIndexParams>(12, 20, 2));
	//匹配
	matcher->match(descriptors_box, descriptors_sence, matches);

	//发现匹配
	vector<DMatch> goodMatches;
	printf("total match points : %d\n", matches.size());

	float maxdist = 0;
	//matches[i].distance描述符欧式距离(knn)

	//找到最大的距离
	for (unsigned int i = 0; i < matches.size(); ++i) {
		printf("dist : %.2f \n", matches[i].distance);
		maxdist = max(maxdist, matches[i].distance);
	}
	for (unsigned int i = 0; i < matches.size(); ++i) {
		if (matches[i].distance < maxdist*RATIO)
			goodMatches.push_back(matches[i]);
	}

	Mat dst;

	drawMatches(box, kpt_obj, scene, kpt_sence, goodMatches, dst);

	imshow("output", dst);

	waitKey(0);
	return 0;
}
  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用FLANN特征匹配进行图像匹配时,可以通过设置距离阈值来判断两幅图像是否匹配成功。具体来说,可以通过以下步骤实现: 1. 提取图像的特征点和特征描述符。 2. 使用FLANN匹配器进行特征点匹配。 3. 计算所有匹配点对的距离,并记录最小距离和最大距离。 4. 根据最小距离和最大距离设置距离阈值,判断两幅图像是否为同一幅图像。 下面是一个简单的示例代码,其中特征点和特征描述符是使用SIFT算法提取的: ```python import cv2 # 读取两幅图像 img1 = cv2.imread('image1.jpg', 0) img2 = cv2.imread('image2.jpg', 0) # 提取特征点和特征描述符 sift = cv2.xfeatures2d.SIFT_create() kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) # 设置FLANN匹配器参数 FLANN_INDEX_KDTREE = 0 index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5) search_params = dict(checks=50) flann = cv2.FlannBasedMatcher(index_params, search_params) # 进行特征点匹配 matches = flann.knnMatch(des1, des2, k=2) # 计算所有匹配点对的距离 distances = [m[0].distance for m in matches] # 计算最小距离和最大距离 min_dist = min(distances) max_dist = max(distances) # 设置距离阈值 threshold = 0.8 * max_dist # 根据距离阈值判断两幅图像是否匹配成功 good_matches = [m for m in matches if m[0].distance < threshold * m[1].distance] if len(good_matches) > 10: print("两幅图像匹配成功!") else: print("两幅图像不匹配。") ``` 在这个示例中,我们通过计算所有匹配点对的距离来设置距离阈值,并使用阈值判断两幅图像是否匹配成功。如果匹配点对的数量大于10个,则认为两幅图像匹配成功。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值