网站被采集 更换模板,wordpress sozo,住建网官网,广告做网站ORB角点检测
可以说ORB是由FAST、灰度质心和BRIEF等技术组合优化形成的#xff0c;不过更准确地说#xff0c;ORB是在FAST特征检测算法基础上#xff0c;结合了灰度质心确定方向以及改进后的BRIEF描述子等技术形成的#xff0c;以下是具体分析#xff1a;
• FAST特征检…ORB角点检测
可以说ORB是由FAST、灰度质心和BRIEF等技术组合优化形成的不过更准确地说ORB是在FAST特征检测算法基础上结合了灰度质心确定方向以及改进后的BRIEF描述子等技术形成的以下是具体分析
• FAST特征检测ORB算法首先采用FAST算法来检测图像中的特征点。FAST算法通过判断以某个像素点为中心的圆周上的像素点灰度值与该中心像素点灰度值的关系快速地筛选出可能的特征点具有速度快的优点。
• 灰度质心确定方向ORB利用灰度质心法为FAST检测出的特征点计算方向。通过计算特征点邻域内的灰度质心确定从特征点到质心的向量方向以此作为特征点的主方向解决了BRIEF描述子不具有旋转不变性的问题。
• 改进的BRIEF描述子ORB采用了改进的BRIEF描述子称为rBRIEF。在确定了特征点的方向后根据该方向对选取的点对进行旋转使得描述子具有旋转不变性。同时还对BRIEF描述子进行了其他一些优化如对特征点的尺度进行考虑等提高了描述子的性能。 SIFT角点检测
检测步骤
• 尺度空间极值检测构建图像的高斯金字塔通过对原始图像与不同尺度倍率的高斯模糊进行卷积将相邻的高斯模糊影像两两相减得到高斯差DoG影像。在DoG影像中查找极大值和极小值这些极值点即为可能的关键点。
• 关键点定位通过关键点附近的像素信息、关键点的尺寸和主曲率来进一步定位各个关键点计算关键点的主曲率消除位于边缘或易受噪音干扰、位置不合适的关键点。
• 方向定向对经过高斯模糊处理后的影像计算相邻像素的梯度量和方向为每个关键点建立一个以10度为单位的36条直方图直方图中最大值的方向成为关键点的方向。若最大值与局部极大值之间的差距不超过20%则认为关键点包含多个方向并创建一个新的关键点。
• 生成描述子以关键点为中心取16×16的区域将其划分为4×4的子区域每个子区域内建立一个八方向的直方图计算每个像素的梯度量值大小与方向并添加到相应的子区域直方图中最终产生一个128维的数据集将其归一化为单位向量作为关键点的描述子。
应用场景
• 物体识别能识别独特的关键点不受移动、旋转、缩放等因素影响可用于从图像或视频中识别特定物体。
• 图像拼接通过检测不同图像中的匹配特征点可实现非全景图像的自动全景重建。
• 三维重建从多个视角的二维图像中提取SIFT特征可用于重建出三维物体的形状和结构。
• 机器人导航与地图构建帮助机器人识别环境中的关键
两者区别
ORB和SIFT的比较如下
计算速度
• ORB基于FAST角点检测和BRIEF描述子二者都是基于二进制操作计算速度快。
• SIFT需要构建尺度空间、进行极值点检测等复杂操作计算量较大速度相对较慢。
特征鲁棒性
• ORB具有一定的旋转不变性但尺度不变性相对较弱对光照变化和噪声敏感度相对较高。
• SIFT对旋转、尺度缩放、亮度变化保持很好的不变性对视角变化、仿射变换、噪声也有一定的稳定性。
特征描述
• ORB采用二进制编码的描述子如通过比较关键点周围的像素点对生成占用空间小匹配时可采用汉明距离等快速计算。
• SIFT生成128维的特征描述子包含了丰富的图像局部梯度等信息特征区分性好但维度高、计算复杂。
应用场景
• ORB适用于实时性要求高的场景如实时图像处理、SLAM等。
• SIFT适用于对精度要求较高对速度要求不苛刻的场景如目标识别、图像拼接、三维重建等。
orb检测速度更快但是空间旋转的控制识别相较于sift没那么好 #include opencv2/opencv.hpp #include iostream
using namespace cv; using namespace std;
int main(int argc, char** argv) { // Mat image imread(D:/images/butterfly.jpg); Mat image imread(C:/newword/image/25.mp4); imshow(input, image); auto orb ORB::create(500);//创建了一个 ORB 特征检测器实例指定最多检测500个关键点 vectorKeyPoint kypts; orb-detect(image, kypts);//使用 detect 函数在图像中检测关键点并存储在 kypts 中 Mat result; drawKeypoints(image, kypts, result, Scalar::all(-1), DrawMatchesFlags::DEFAULT);//
drawKeypoints函数是OpenCV中用于在图像上绘制特征点的函数下面对drawKeypoints(image, kypts, result, Scalar::all(-1), DrawMatchesFlags::DEFAULT);这行代码的参数进行详细解释
• image表示输入的源图像是要在其上绘制关键点的图像函数不会对该图像进行修改仅用于获取图像数据和尺寸等信息。
• kypts是vectorKeyPoint类型的容器包含了要绘制的关键点信息每个KeyPoint对象包含了关键点的坐标、尺度、方向等属性。
• result是输出图像函数会将绘制了关键点的图像输出到这个Mat对象中其尺寸和类型与输入图像image相同。
• Scalar::all(-1)用于指定绘制关键点的颜色。Scalar是OpenCV中用于表示颜色的结构体Scalar::all(-1)表示使用默认的随机颜色来绘制每个关键点。
• DrawMatchesFlags::DEFAULT是绘制的标志位指定了绘制关键点的方式和细节DrawMatchesFlags::DEFAULT表示使用默认的绘制方式会绘制关键点的圆圈以及方向如果有的话。 Mat desc_orb; orb-compute(image, kypts, desc_orb); std::cout desc_orb.rows x desc_orb.cols std::endl;
1. orb-compute(image, kypts, desc_orb);
• 这是在OpenCV中使用ORBOriented FAST and Rotated BRIEF特征检测器的compute方法。
• orb是一个指向ORB对象的指针compute方法的作用是根据给定的图像image和已经检测到的关键点kypts计算这些关键点对应的描述符。
• 描述符是一种用于描述关键点特征的向量它包含了关键点周围图像的局部信息这些信息可以用于后续的特征匹配等操作。计算得到的描述符会存储在desc_orb这个Mat对象中。desc_orb的每一行代表一个关键点的描述符向量。
2. std::cout desc_orb.rows x desc_orb.cols std::endl;
• 这行代码用于输出描述符矩阵desc_orb的尺寸信息。
• desc_orb.rows表示描述符矩阵的行数即关键点的数量。
• desc_orb.cols表示描述符矩阵的列数即每个关键点描述符向量的维度。
• 这行代码通过std::cout将描述符矩阵的行数和列数以行数 x 列数的形式输出到控制台方便用户了解描述符的基本信息例如输出可能是100 x 32表示检测到了100个关键点每个关键点的描述符是32维的向量。 imshow(ORB关键点检测, result); waitKey(0); return 0; } SIFT检测
#include opencv2/opencv.hpp #include iostream
using namespace cv; using namespace std;
int main(int argc, char** argv) { // Mat image imread(D:/images/butterfly.jpg); Mat image imread(C:/newword/image/28.jpg); imshow(input, image); auto sift SIFT::create(500); vectorKeyPoint kypts; sift-detect(image, kypts); Mat result; drawKeypoints(image, kypts, result, Scalar::all(-1), DrawMatchesFlags::DEFAULT); std::cout kypts.size() std::endl; for (int i 0; i kypts.size(); i) { std::cout pt: kypts[i].pt angle: kypts[i].angle size: kypts[i].size std::endl; } Mat desc_orb; sift-compute(image, kypts, desc_orb); std::cout desc_orb.rows x desc_orb.cols std::endl; imshow(SIFT关键点检测, result); waitKey(0); return 0; }
与上面的ORB思路差不多