知乎专栏,opencv实现,40+文章,不错:https://www.zhihu.com/column/lowkeyway-OpenCV
opencv docs——Feature Matching:https://opencv24-python-tutorials.readthedocs.io/en/latest/py_tutorials/py_feature2d/py_matcher/py_matcher.html
很早之前看过这个教程,但没想到这其实就是传统的基于2D图像特征模板做匹配实现物体识别的技术路线。
如今,当讨论到物体检测时,通常理解的是“区域提议+物体识别”这个组合,零几年的时候出现了类似滑动窗口+HOG+SVM这种检测行人的方案,即做了特征提取后使用分类器将该特征进行分类,这就是传统物体检测的思路。后面深度学习也是这种思路,只是使用了深度神经网络代替传统方法实现了特征提取与分类。
但是,在这种特征提取+分类的思路出现前莫非就不能做物体的识别和检测了?比如:下文提到的模板匹配的方法,模板匹配的关键是有一个或一组事先已经生成的模板。匹配模板图像与目标图像的特征点实现物体检测。特征的也有颜色、纹理、形状等多种定义。比如《基于 Kinect 的物体分割与识别算法研究,D》中介绍了统计模板图像的颜色HSV空间分布直方图,H分为8个Bin,区域各分为3个,由此形成72维特征向量的模板,在目标图像内先使用分割算法进行区域提议,然后将得到的区域进行颜色特征提取并于模板匹配。
所以,应该宽泛的理解“物体检测”,不是只有“特征提取+分类”这种思路,在很多简单的应用场景下可以使用比较简单的方法达到物体检测的目的。(比如之前识别可乐拉罐直接简单的识别红色色块,这不也是达到了物体检测的目的?)
what we need?流程简述:
目标物体模板:用一张(多张,maybe不同角度)仅包含目标物的图像进行特征点检测与描述,从而生成一组(多组)特征描述子模板。一组模板的shape为m X n,m为点特征点个数,n为特征向量的维度。
待查找图片(包含有目标物体):对该图像进行特征点检测与描述,生成一组特征描述子。shape为k X n。k为特征点个数,n为特征向量的维度。
特征匹配过程:将模板与步骤2生成的特征描述子进行匹配(查找最近邻)
计算单应性矩阵,实现目标物体图像到实际查找图像的转换。(最少需要4组点对计算单应矩阵,使用ransac方法对原始匹配进行误匹配剔除并计算最优转换)(这样就实现在检测图片出框选出了模板图片,如果还有对齐的深度图,可以直接在深度图上把物体抠出来)
特征点=关键点(key points)+对应的特征描述(descriptor)
机器视觉在工业机器人分拣系统中的应用[D],2018,宋玉雪
知乎专栏,三个算法都有讲解:https://www.zhihu.com/column/c_1296447643791560704
SIFT算法:https://zhuanlan.zhihu.com/p/343522892(更清晰)
SIFT特征详解 :https://www.cnblogs.com/wangguchangqing/p/4853263.html
看上面链接吧,高斯尺度空间。
128维特征描述。
主要思路:
为了提取尺度不变的特征点,在图像金字塔内进行特征点检测。早期的图像金字塔直接将图像不断降采样到原来的1/2,高斯尺度空间额外对同一大小的图像进行不同大小的高斯模糊(模拟人眼看物体的模糊程度)
为了应对方向不变,计算特征点的邻域内的梯度方向与梯度值(使用直方图,360分为8个bin,每个bin45度,然后统计梯度值累加),统计最大的方向作为主方向。
特征描述:选取16X16的邻域,选取4X4的格子作为种子邻域,同样也使用直方图统计每一个种子邻域的直方图,那么每个种子邻域形成8维向量,16个种子形成128维向量,然后再进行一行额外操作,比如归一化等。
Speeded Up Robust Features.
(1)在生成尺度空间方面,SIFT中下一组图像的尺寸是上一组的一半,同一组间图像尺寸一样,但是所使用的高斯模糊系数逐渐增大。而在SURF中,不同组间图像的尺寸都是一致的,但不同组间使用的盒式滤波器的模板尺寸逐渐增大,同一组间不同层间使用相同尺寸的滤波器,但是滤波器的模糊系数逐渐增大。
(2)在特征点检验时,SIFT算子是先对图像进行非极大值抑制,再去除对比度较低的点。然后通过Hessian矩阵去除边缘的点。SURF算法是先通过Hessian矩阵来检测候选特征点,然后再对非极大值的点进行抑制。
(3)在特征向量的方向确定上,SIFT算法是在正方形区域内统计梯度的幅值的直方图,找到最大梯度幅值所对应的方向。SIFT算子确定的特征点可以有一个或一个以上方向,其中包括一个主方向与多个辅方向。SURF算法则是在圆形邻域内,检测各个扇形范围内水平、垂直方向上的Haar小波响应,找到模值最大的扇形指向,且该算法的方向只有一个。
(4)SIFT算法生成描述子时,是将16x16的采样点划分为4x4的区域,从而计算每个分区种子点的幅值并确定其方向,共计4x4x8=128维。SURF算法在生成特征描述子时将的正方形分割成4x4的小方格,每个子区域25个采样点,计算小波haar响应,一共4x4x4=64维。
综上,SURF算法在各个步骤上都简化了一些繁琐的工作,仅仅计算了特征点的一个主方向,生成的特征描述子也与前者相比降低了维数。
Oriented FAST and Rotated BRIEF ,改进了FAST角点与BRIEF描述子
Fast是一个非常快速的关键点检测算法(不带特征描述),思路是直接比较当前点与邻域点的亮度差异。没有什么求导、积分、卷积操作,只比较亮度大小,所以很快。流程如下(图源视觉SLAM 14讲):
关键点:
但是FAST关键点没有尺度和方向,使用图像金字塔(简单的上、下采样)解决尺度问题,方向是通过灰度质心法解决。
灰度质心法顾名思义是计算邻域内灰度的质心,公式很简单,就是加权平均。 $$ x_0=\frac {\sum_{x, y \in B} x I(x, y)} {\sum_{x, y \in B} I(x, y)}, y_0=\frac {\sum_{x, y \in B} y I(x, y)} {\sum_{x, y \in B} I(x, y)} $$ 将当前点与质心进行连线,就生成了该关键点的方向了。
特征描述:
特征点检测-ORB:https://zhuanlan.zhihu.com/p/91479558
邻域内随机选取两点,比较点的亮度强弱关系,从而赋值0或1。选取N=256组,形成256维向量。上述链接为数不多的介绍了brief描述子的特征匹配规则,及使用汉明距离,因为每一维要么是0要么是1,所以距离的理论值是[0, N]
为了解决旋转不变性,使用关键点提取部分得到的方向旋转邻域,然后再计算描述子。
为了优化性能,其实还做了一步使用贪心算法的优化,但不过多介绍。