您的位置:

ORB特征点

一、ORB特征点匹配

ORB特征点匹配是将图像中的ORB特征点进行匹配,找到两张图像中相对应的特征点,从而实现图像的拼接、目标跟踪、三维重建等功能。

在进行ORB特征点匹配之前,需要对ORB特征点进行提取。提取ORB特征点的方法有ORB算法、FAST算法、SIFT算法等,其中ORB算法最常用且效果较好。

ORB特征点匹配的步骤如下:

//提取图像中的ORB特征点
cv::ORB orb;
cv::Mat descriptors1, descriptors2;
std::vector keypoints1, keypoints2;
orb.detectAndCompute(image1, cv::Mat(), keypoints1, descriptors1);
orb.detectAndCompute(image2, cv::Mat(), keypoints2, descriptors2);

//进行ORB特征点匹配
cv::BFMatcher matcher(cv::NORM_HAMMING);
std::vector
    matches;
matcher.match(descriptors1, descriptors2, matches);

   
  

其中,ORB算法需要调整一些参数,如ORB::nFeatures、ORB::scaleFactor、ORB::nlevels等,以控制提取的ORB特征点数量、特征点尺度等,从而获得更好的匹配效果。

二、ORB特征

ORB特征是一种不变特征,它对光照变化、旋转、缩放等因素具有鲁棒性。

ORB特征本质上是由二进制位组成的字符串,可以用来表示图像特征。ORB特征点的提取过程中,每个特征点都会生成一个128维的ORB特征向量。这128维向量是通过计算特征点周围的像素点与特征点的灰度值差异、方向等信息得到的。

与SIFT、SURF等特征相比,ORB特征是由二进制位组成的字符串,具有更高的计算效率,可以被广泛应用到实时图像处理、嵌入式设备等场合。

三、ORB特征点提取

ORB特征点提取是指从图像中提取出ORB特征点的过程。ORB特征点提取主要包括以下几个步骤:

1、构建图像金字塔:对图像进行多次缩放,得到不同尺度的图像。

2、通过Harris角点算子或FAST(Features from Accelerated Segment Test)算法检测图像中的角点。

3、在检测到的角点周围,使用尺度不变的BRIEF(Binary Robust Independent Elementary Features)算法进行特征描述。

4、在所有提取出的特征点中,使用非最大值抑制算法进行筛选,选取较为显著的特征点。

ORB特征点提取的MATLAB代码实现如下:

%构建图像金字塔
octaves = 4;
scales = 5;
sigma = 1.2;
img_pyr = cell(1, octaves);
img_pyr{1} = im;
for i=2:octaves
    img_pyr{i} = impyramid(img_pyr{i-1}, 'reduce');
end
%检测ORB特征点
keypoints = cell(1, octaves*scales);
idx = 1;
for o=1:octaves
    for s=1:scales
        scale = sigma^((o-1)*scales + s - 1);
        radius = 3 * scale;
        corners = detectFASTFeatures(img_pyr{o}); %使用FAST算法检测角点
        [descriptors, valid_corners] = extractFeatures(img_pyr{o}, corners); %使用BRIEF算法进行特征描述
        keypoints{idx} = valid_corners.selectStrongest(200); %使用非最大值抑制算法筛选显著的特征点
        idx = idx + 1;
    end
end

四、ORB特征点在MATLAB中的选取

MATLAB中可以使用“detectSURFFeatures”函数、"detectBRISKFeatures"函数等实现ORB特征点的提取和选取。

例如,使用“detectSURFFeatures”函数进行ORB特征点提取和选取的MATLAB代码如下:

%使用SURF算法提取ORB特征点
pts = detectSURFFeatures(rgb2gray(im), 'MetricThreshold',100, 'NumOctaves', 3, 'NumScaleLevels', 4);

%筛选出ORB特征点
keypoints = pts.selectStrongest(200);

使用不同的参数值,可以控制提取和选取的ORB特征点数量和质量。