如何从图像中提取特征点
“ 此篇介绍图像的特征点匹配算法,包括ORB特征点算法介绍、特征点匹配以及RANSAC优化”
作者 | zhangJA来源 | 程序算法实验室
特征点匹配也可了解为角点匹配
,角点匹配在上篇《Shi-Tomasi角点检测》和《Harris角点检测》已论述过。
图像匹配的应用场合有目标跟踪
,检测
,识别
,图像拼接
等,这些应用的最核心技术即是特征点匹配,所谓特征点匹配是指寻找两张图像之间的特征像素点的对应关系,从而确定两张图像的位置关系。
特征点匹配一般分为四大步骤:
提取检测子:在两张待匹配的图像中寻找那些最容易识别的像素点(角点),比如纹理丰富的物体边缘点等。
取描述子:对于检测出的角点,用一些数学上的特征对其进行描述,如梯度直方图,局部随机二值特征等。检测子和描述子的常用提取方法有:sift,harris,surf,fast,agast,brisk,freak,brisk,bri、tef/
orb
等。匹配:通过各个角点的描述子来判断它们在两张图像中的对应关系,常用方法如 flann等。
消噪:去除错误匹配的外点,保留正确的匹配点。常用方法有KDTREE,BBF,
Ransac
,GTM等。
以下对此详细说明:
01
—
特征点匹配
✎ORB特征点¹
▧ 原理概述------------------------------------«1»
特征点是用于描述图像中含有特殊信息的一类点,包含像素点坐标、用于唯一的描述此像素点属性的一些特征。
特征点检测算法有SIFT、SURFT、ORB
等,SIFT SURFT提取精度高,但消耗时间长;ORB
提取特征点则耗时短。以下对仅对ORB
展开赘述。
(base) zja@zja:~/Works/zja_Project/2-VisonProject/1-Cmake_Build/$ tree -L 2.├── CMakeLists.txt├── CMakeLists.txt.user├── main1.cpp├── main2.cpp├── main3.cpp├── ORB特征点.md├── ORB特征点匹配.md├── RANSAC优化.md├── _v_recycle_bin│ └── 20210117└── vx_images ├── 3824741984446.png └── 3955907518314.png(base)zja@zjaVirtualBox:~$ bash c++.shCV Runing......
▧算法步骤--------------------------------------«2»
1.ORB特征点求取
Step1:选择某个像素点作为中心点P,其像素值为I;Step2:设置判定FAST角点的像素阈值,例如:Tp=20%*Ip;Step3:比较中心点的像素值与半径为3的圆周上所有像素的像素值进行比较,如果存在连续N个像素的像素值大于(Ip+Tp)或者小于(Ip-Tp);Step4:遍历图像中的每个像素点,重复以上步骤,计算图像中的FAST角点;
2.ORB特征点方向计算步骤
Step1:
计算图像矩;
$m_{pq}=\sum_{x,y\in B}x^py^qI(x,y),p,q=0,1$
Step2:
计算矩形区域的质心;
$C=(m_{10}/m_{00} , m_{01}/m_{00})$
Step3:
连接FAST角点与质心得到方向向量;
$\theta=arctan(m_{01}/m_{10})$
☢注意:ORB特征点描述子
128维BRIEF描述子
高斯金字塔(尺度特征不变)