一.ORB特征组成
//特征就是角点
//ORB特征具有速度快的优点,可以用于实时提取。
//ORB:FAST关键点+BRIEF 描述子
//FAST是一种角点,主要是检测局部像素灰度变化明显的地方,苏地块。FAST思想:如果一个像素与它邻域的像素差别较大,那他可能是角点。
//FAST提取步骤:
- 在图像中选取像素 p,假设它的亮度为 Ip。
- 设置一个阈值 T(比如 Ip 的 20%)。
- 以像素 p 为中心, 选取半径为 3 的圆上的 16 个像素点
- 选取的圆上,有连续N个点的灰度值大于Ip+T或小于Ip-T,则p可以被认为是关键点
(N=9,11,12)
//FAST提取角点过多,对原始的FAST角点计算Harris响应值,提取前N个最大响应值的角点。
//FAST不具有方向信息。由于它固定取半径为3的圆,有尺度问题;
1.scale:图像金字塔,对每一层检测角点
2.rorate:灰度质心法,用圆的质心与几何中心得到向量即为关键点的方向。
//BRIEF 描述子:描述关键点周围像素的信息,(外观相似的特征应该有相似的描述子),采用二进制编码,取周围128个像素,当像素灰度值大于临近像素则为1,反之为0.由于FAST的改进,秒速自有有scale,rorate不变性.
//两种匹配模式:暴力匹配,快速最近邻匹配。
1.暴力匹配:测量描述子之间的距离(通常采用汉明距离和欧氏距离),汉明距离是采用BRIEF二进制描述子进行匹配,浮点型描述子用欧式距离匹配。
2.暴力匹配产生的特征点较多,采用FLANN方法可以提高质量,降低计算量。
//读取图像,加载ORB模块
//读取图像
Mat img_1 = imread("C:\\Users\\Administrator\\Pictures\\1.png");
Mat img_2 = imread("C:\\Users\\Administrator\\Pictures\\2.png");
std::vector<KeyPoint> keypoints_1, keypoints_2