opencv中fast特征匹配_OpenCV中ORB特征提取与匹配

本文介绍了OpenCV中ORB(Oriented Fast and Rotated BRIEF)特征提取与匹配的过程,包括FAST特征点定位、BRIEF特征描述子、旋转不变性以及在实际代码中的应用。ORB算法结合了FAST的特征检测和BRIEF的描述子,具有旋转不变性和噪声抑制特性。在匹配过程中,使用FLANN进行对象匹配,并解决了因特征类型导致的匹配错误问题。
摘要由CSDN通过智能技术生成

原标题:OpenCV中ORB特征提取与匹配

OpenCV中ORB特征提取与匹配 FAST特征点定位

ORB - (Oriented Fast and Rotated BRIEF)算法是基于FAST特征检测与BRIEF特征描述子匹配实现,相比BRIEF算法中依靠随机方式获取二值点对,ORB通过FAST方法,FAST方式寻找候选特征点方式是假设灰度图像像素点A周围的像素存在连续大于或者小于A的灰度值,选择任意一个像素点P,假设半径为3,周围16个像素表示如下:

假设存在连续N个点满足

则像素点P被标记为候选特征点、通常N取值为9、12,上图N=9。 为了简化计算,我们可以只计算1、9、5、13四个点,至少其中三个点满足上述不等式条件,即可将P视为候选点。

BRIEF特征描述子

得到特征点数据之后,根据BRIEF算法就可以建立描述子。选择候选特征点周围SxS大小的像素块、随机选择n对像素点,定义如下:

其中P(x)是图像模糊处理之后的像素值,原因在于高斯模糊可以抑制噪声影响、提供特征点稳定性,在实际代码实现中通常用均值滤波替代高斯滤波以便利用积分图方式加速计算获得更好的性能表现。常见滤波时候使用3x3~9x9之间的卷积核。滤波之后,根据上述描述子的生成条件,得到描述子表达式如下:

作者论文提到n的取值通常为128、256或者512。得到二进制方式的字符串描述子之后,匹配就可以通过XOR方式矩形,计算汉明距离。ORB特征提取跟纯BRIEF特征提取相比较,BRIEF方式采用随机点方式得最终描述子、而ORB通过FAST得到特征点然后得到描述子。

旋转不变性

ORB比BRIEF方式更加合理,同时具有旋转不变性特征与噪声抑制效果,ORB实现选择不变性特征,是通过对BRIEF描述子的特征点区域的计算得到角度方向参数。主要原理是使用几何距公式。图像的几何距计算公式如下:

其中n=p+q称为N阶距。得到中心坐标为:

计算得到角度为:

ORB算法根据角度参数提取BRIEF描述子,实现旋转不变性特征。随机ORB算法通过贪心算法进一步发现低相关性描述子作为最终二值字符串描述子输出。通常是256位的特征描述子,完整的ORB特征描述子算法流程图如下:

OpenCV中基于ORB特征对象匹配代码演示如下:

#include

#include

#defineRATIO0.4

usingnamespacecv;

usingnamespacestd;

Matbox=imread("D:/vcprojects/images/box.png");

Matscene=imread("D:/vcprojects/images/box_in_scene.png");

if(scene.empty()){

printf("could not load image...n");

return-1;

}

imshow("input image",scene);

vectorkeypoints_obj,keypoints_sence;

Matdeors_box,deors_sence;

Ptrdetector=ORB::create();

detector->detectAndCompute(scene,Mat(),keypoints_sence,deors_sence);

detector->detectAndCompute(box,Mat(),keypoints_obj,deors_box);

vectormatches;

// 初始化flann匹配

// Ptr matcher = FlannBasedMatcher::create(); // default is bad, using local sensitive hash(LSH)

Ptrmatcher=makePtr(makePtr<:lshindexparams>(12,20,2));

matcher->match(deors_box,deors_sence,matches);

// 发现匹配

vectorgoodMatches;

printf("total match points : %dn",matches.size());

floatmaxdist=0;

for(unsignedinti=0;i

printf("dist : %.2f n",matches[i].distance);

maxdist=max(maxdist,matches[i].distance);

}

for(unsignedinti=0;i

if(matches[i].distance

goodMatches.push_back(matches[i]);

}

Matdst;

drawMatches(box,keypoints_obj,scene,keypoints_sence,goodMatches,dst);

imshow("output",dst);

waitKey(0);

return0;

}

在OpenCV中基于BRIEF与ORB特征实现FLANN对象匹配经常会遇到一个错误如下:

原因是BRIEF与ORB特征是二进制的CV_8U而SIFT与SURF特征数据是浮点数,FLANN默认的匹配是基于浮点数运算计算距离,所以导致了类型不支持错误,这个时候只要使用如下的方法重新构造一下FLANN指针,然后调用match方法即可。

Ptrmatcher=makePtr

(makePtr<:lshindexparams>(12,20,2));

运行结果:

为学患无疑,疑则进也

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值