ORB特征基于FAST焦点的特征点检测与描述技术,该特征的描述方法可应用于实时性特征检测。ORB特征检测具有尺度和旋转不变性,同时对噪声及透视仿射也具有不变性,良好的性能能使得利用ORB在进行特征描述时的应用场景十分广泛。主要分为以下两个步骤。
1.方向FAST特征点检测
FAST角点是一种基于机器学习的快速角点检测算法,具有方向的FAST关键点对兴趣点所在圆周上的16个像素点进行判断,若盘点后的当前中心像素点为暗或亮,将决定其是否为角点。FAST角点检测计算的实际复杂度小,检测效果突出。FAST角点检测为加速该算法实现,通常先对圆周上的点集进行排序,排序使得七计算过程大大得到了优化。FAST多尺度特性通过建立图像金字塔获得,引入灰度质心法用于实现特征点方向。特征点中心强度定义如下式:
其中Mpq为特征点邻域p+q阶距,特征点主方向定义为
2.BRIEF特征描述
BRIEF描述子主要是通过随机取兴趣点周围区域的若干点来组成小兴趣区域,将这些小兴趣区域的灰度二值化并解析成二进制码串,将串特征作为该兴趣点的描述子。BRIEF描述子选取关键点附近的区域并对每一位比较其强度大小,然后根据图像块中两个二进制点来判断当前关键点编码是0还是1.因为BRIEF描述子的所有编码都是二进制的,这样就节省了计算机存储空间。BRIEF描述子在解决旋转不变性是通过控制FAST特征点方向实现的,任意特征点序列BRIEF是一个长度为n的二值码串,这个二值串是由特征点周围2n个点构成的,将这些点组成下面的矩阵S:
关键点周围邻域构成图像块的主方向,对应的旋转矩阵构建矩阵S及更新版本满足下式:
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\xfeatures2d\nonfree.hpp>
#include <opencv2\imgproc\imgproc.hpp>
cv::Mat ORBeatureAndCompare(cv::Mat InputImage1, cv::Mat InputImage2)
{
cv::Mat ans;
cv::Mat d_srcL, d_srcR;
cv::cvtColor(InputImage1, d_srcL, CV_BGR2GRAY);
cv::cvtColor(InputImage2, d_srcR, CV_BGR2GRAY);
cv::Mat d_descriptorsL, d_descriptorsR;
cv::Ptr<cv::ORB> f_orb = cv::ORB::create();
std::vector<cv::KeyPoint> keypoint1, keypoint2;
cv::Ptr<cv::DescriptorMatcher> d_matcher = cv::DescriptorMatcher::create(cv::NORM_L2);
std::vector<cv::DMatch> matches;//普通匹配
f_orb->detectAndCompute(d_srcL, cv::Mat(), keypoint1, d_descriptorsL);
f_orb->detectAndCompute(d_srcR, cv::Mat(), keypoint2, d_descriptorsR);
d_matcher->match(d_descriptorsL, d_descriptorsR, matches);
drawMatches(InputImage1, keypoint1, InputImage2, keypoint2, matches, ans);
return ans;
}