容来自OpenCV-Python Tutorials 自己翻译整理 理论: 作为一个OpenCV的爱好者,ORB算法最看重的一点就是本算法来自OpenCV实验室。这个算法由Ethan Rublee, Vincent Rabaud, Kurt Konolige 和Gary R. Bradski科学家在他们的论文“ORB:一种有效的替代SIFT或者SURF的算法”中于2011年发表。 就像标题中描述的一样,这是一个在计算量和匹配性能以及专利问题上替代SIFT和SURF算法的一个算法。 没错,SIFT和SURF算法是受到版权保护的,你需要付费使用。但是ORB不需要。 ORB基本上融合了FAST关键点检测和BRIEF描述子的特性,并且修改了很多内容用来提高性能。 首先,ORB算法使用FAST算法寻找关键点,然后使用Harris角点检测找到这些点当中的最好的N个点。它同样使用了金字塔来生成多尺度特征。但是,其中一个问题是FAST算法不会计算特征点的方向。所以,如何获得旋转不变性呢? 作者特出了如下修改。 (增加旋转不变性的:) ORB算法计算了以当前角点为中心所在区域的强度加权质心。那么,当前角点的方向向量就是由这个角点指向这个质心的方向。为了提高旋转不变性,还计算了以角点为圆心,半径大小为r的区域的矩(moments),坐标为x,y。 对于描述符,ORB算法使用了BRIEF算法的描述符。但是我们早就了解了BRIEF的描述符在旋转的图像下表现很差劲。所以,ORB根据特征点的方向使用了一种“可控BRIEF”描述符。对于任意特征集,例如在(<span class="MathJax" id="MathJax-Element-1-Frame" tabindex="0" data-mathml="xi,yi" role="presentation" style="box-sizing: border-box; outline: 0px; display: inline; line-height: normal; text-align: left; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; word-break: break-all; position: relative;">xi,yixi,yi)点的二进制检测,定义一个2×n的矩阵S,里面有n个之前找到的特征点,借用之前计算得到的角度,利用旋转矩阵来旋转矩阵S得到<span class="MathJax" id="MathJax-Element-2-Frame" tabindex="0" data-mathml="Sθ" role="presentation" style="box-sizing: border-box; outline: 0px; display: inline; line-height: normal; text-align: left; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; word-break: break-all; position: relative;">SθSθ,这样就得到了可控的BRIEF描述符。 ORB算法将角度离散化为增量12度一个单位的角度,然后构造一个预先计算BRIEF模式的查找表。只要特征点的方向<span class="MathJax" id="MathJax-Element-3-Frame" tabindex="0" data-mathml="θ" role="presentation" style="box-sizing: border-box; outline: 0px; display: inline; line-height: normal; text-align: left; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; word-break: break-all; position: relative;">θθ始终一致,那么正确的特征点的集合<span class="MathJax" id="MathJax-Element-4-Frame" tabindex="0" data-mathml="Sθ" role="presentation" style="box-sizing: border-box; outline: 0px; display: inline; line-height: normal; text-align: left; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; word-break: break-all; position: relative;">SθSθ就会用来计算描述符。 (特征点匹配:rBRIEF) BRIEF算法有一个重要的性质就是每一位的特征都有很大的差异,并且差异大小的均值接近0.5。但是一旦它的方向沿着特征点的方向,它就会去掉了这个差异,并且变得更加分散。方差变大使得特征变得更加容易区分,因为它接受了不同的输入。另外一个让人满意的性质是让测试都不相关,因为这样每个测试都会贡献出影响。为了解决上面的问题,ORB使用了一个贪心搜索侧率,在所有可能的二进制测试当中去找到的一个拥有方差值高并且均值接近0.5的特征点,而且是不相关的。这个方法叫做rBRIEF算法。 对于描述符匹配,多探测局部敏感哈希(multi-probe LSH)在传统的LSH算法上有所用提高,并使用在描述符配的算法当中。论文中指出,ORB算法比SURF和SIFT算法更快速,并且ORB描述符的效果比SURF更高。ORB在低功耗设备上是一个不错的选择。 from matplotlib import pyplot as plt img = cv2.imread('1.jpg',0) kp = orb.detect(img,None) kp, des = orb.compute(img, kp) img = cv2.drawKeypoints(img,kp,img,color=(0,255,0), flags=0) 
|
|