FLANN特征匹配

FLANN特征匹配

特征的概念:

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

图像的特征工程:

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

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

例图:
FLANN特征匹配_第1张图片
例子:

#include 
#include 
#include 

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 kpt_obj, kpt_sence;
	//描述子
	Mat descriptors_box, descriptors_sence;

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

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

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

	//发现匹配
	vector 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;
}

你可能感兴趣的:(图像处理)