opencv学习——ORB(Oriented FAST and Rotated BRIEF)

本文介绍了图像处理中的ORB特征检测器,它是FAST与BRIEF的结合,具备旋转不变性和尺度不变性。ORB首先使用FAST算法找出关键点,再用Harris角点检测排序并选择前N个点,通过灰度矩确定方向。BRIEF被用来创建旋转稳定的描述符,通过对关键点区域进行旋转校正来增强旋转不变性。

1、FAST
FAST算子的基本原理是:若某像素点与其周围领域内足够多的连续的像素点存在某一属性差异,并且该差异大于指定阈值,则可以断定该像素点与其邻域像素有可被识别的不同之处,可以作为一个特征点(角点);对于灰度图像,FAST算子考察的属性是像素与其邻域的灰度差异。
这个检查过程可以用下图更清楚的描述:对于图像上所有像素点,考察其7*7邻域内以该点为圆心,半径是3的圆周上的共计16个像素点和中心点的差异。如果有连续的12(或9)个像素点与中心点的灰度差的绝对值大于或低于某一给定阈值,则该点被检测为FAST特征点。

为了提高检测速度,FAST提出分割测试的概念,不是逐个遍历考察圆周上的16个像素点,而是先考察垂直和水平方向上的4个点,1,9,5,13 进行测试(先测试 1 和 19, 如果它们符合
阈值要求再测试 5 和 13)。如果 p 是角点,那么这四个点中至少有 3 个要符合阈值要求。如果不是的话肯定不是角点,就放弃。对通过这步测试的点再继续进行测试(是否有 12 的点符合阈值要求)。基于FAST算子要求圆周上最少有12(或9)个连续的差异较大的点,如果垂直和水平方向上4个点中有2个或2个以上不满足要求的点,则可以直接判断该点不是FAST特征点,这样可以排除绝大部分非FAST特征点。进过初步筛选,在对剩下的符合条件的点实施FAST算子进行特征点检测,最后进过非极大值抑制后得到最终的特征点检测结果。
这里写图片描述
但它的缺点是不具有方向性,尺度不变性。但速度快。缺点:
• 当 n<12 时它不会丢弃很多候选点 (获得的候选点比较多)。
• 像素的选取不是最优的,因为它的效果取决与要解决的问题和角点
的分布情况。
• 高速测试的结果被抛弃

Oriented FAST and Rotated BRIEFORB)是一种用于图像特征提取和描述的算法,具有关键Oriented FAST)和描述子(Rotated BRIEF)两个特征,描述子用于描述关键周围的图像信息,并用描述向量表示 [^1]。 ORB算法包含两部分的改进,一部分是将FAST改进为Oriented FAST,另一部分是将BRIEF改进为Rotated BRIEF [^1]。原始的BRIEF描述子在旋转情况下表现较差,而ORB会根据关键的方向对BRIEF进行“引导”。对于位置 \((x_i, y_i)\) 处的任意二进制测试特征集,定义一个 \(2 \times n\) 的矩阵 \(S\) ,其包含这些像素的坐标。然后利用图像块的方向 \(\theta\) 找到其旋转矩阵,并对 \(S\) 进行旋转,得到旋转后的版本 \(S_{\theta}\) [^2]。此外,ORB特征的描述子是在BRIEF描述子基础上添加了类似于SIFT特征的旋转不变性 [^3]。 在应用方面,ORB由于其快速和有效的特,在计算机视觉领域有广泛应用。例如在图像匹配任务中,通过提取ORB特征和描述子,可以快速准确地找到不同图像中的匹配;在视觉SLAM(同时定位与地图构建)中,ORB可以用于提取环境特征,辅助机器人或相机进行定位和地图构建。 以下是使用OpenCV库实现ORB特征提取和匹配的Python示例代码: ```python import cv2 import numpy as np # 读取图像 img1 = cv2.imread('image1.jpg', cv2.IMREAD_GRAYSCALE) img2 = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE) # 创建ORB对象 orb = cv2.ORB_create() # 检测关键并计算描述子 kp1, des1 = orb.detectAndCompute(img1, None) kp2, des2 = orb.detectAndCompute(img2, None) # 创建BFMatcher对象 bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) # 匹配描述子 matches = bf.match(des1, des2) # 按距离排序 matches = sorted(matches, key=lambda x: x.distance) # 绘制前10个匹配 img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS) # 显示结果 cv2.imshow('Matches', img3) cv2.waitKey(0) cv2.destroyAllWindows() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值