特征点由关键点和描述子两部分组成:
ORB特征点由关键点FAST角点 和描述子BRIEF组成。
FAST算法的思想:通过比较像素相对于中心像素有较大差别(过亮、过暗)时,则快速地检测出角点。步骤如下:
为每个检测到的角点分配一个主方向。为了实现旋转不变性,采用灰度质心算法(Intensity Centroid)进行实现。对特征点附近的图像灰度质心进行计算,所谓质心是指图像块灰度值作为权值的中心,计算方式如下:
BRIEF描述子生成算法的思想:是通过比较两个像素点对之间的灰度差异,并将比较结果编码为二进制字符串。具体描述BRIEF描述子的步骤如下:
对于图像中的两个特征点,使用描述子之间的距离或相似度度量进行匹配。最常见的方法是计算描述子之间的汉明距离(Hamming Distance)或欧氏距离,并根据预设的阈值来判断是否匹配成功。也可以使用快速匹配算法(如KD树或近似最近邻算法)来加速匹配过程。
static Ptr
cV::ORB::create ( int nfeatures = 500, float scaleFactor = 1.2f,
int nlevels = 8,
int edgeThreshold = 31,
int firstLevel = 0,
int WTA K = 2,
ORB::ScoreType scoreType = ORB: :HARRIS_SCORE,
int patchSize = 31,
int fastThreshold = 20
)
void ORB_f(Mat mat){
//创建ORB特征点类变量
Ptr orb=ORB::create(500,//特征点数目
1.2f,//金字塔层级之间的缩放比例
8,//金字塔图像层级系数
31,//边缘阈值
0,//原图在金字塔中的层数
2,//生成描述子时需要用的像素点数目
ORB::HARRIS_SCORE,//使用Harris方法评价特征点
31,//生成描述子时关键点周围邻域的尺寸
20//计算FAST角点时像素值差值的阈值
);
//计算ORB关键点
vector Keypoints;
orb->detect(mat,Keypoints);//确定关键点
//计算ORB描述子
Mat descriptions;
orb->compute(mat,Keypoints,descriptions);//计算描述子
//绘制特征点
Mat mat2;
mat.copyTo(mat2);
//绘制不含角度和大小的结果
drawKeypoints(mat,Keypoints,mat,Scalar(255,255,255,255));
//绘制不含角度和大小的结果
drawKeypoints(mat,Keypoints,mat2,Scalar(255,255,255,255),DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
//显示结果
imwrite("/sdcard/DCIM/mat.png",mat);
imwrite("/sdcard/DCIM/mat2.png",mat2);
}
显示结果:
(绘制不含角度和大小的结果) (绘制含角度和大小的结果)