http://wenku.baidu.com/link?url=R4Ev8aJNxwmjV0egSUqVBjmnt1KT_llzp8Oy2NbHnwa7Me9UAIHkiMG2Vwucu3RSDKwy_WaYO_5o1RFMWeQ-7gqbFzCEv30sJpoMzjv1dj_
http://wenku.baidu.com/link?url=nzhQ4CVu3Qprvjx2KBVz9XOqDScMIsmLgfbqLlwdxjIcQa1zYIc0iB-kS2MnGaCCUUcAs6oXkETLn1qftT0YR-epNiXKOMg-EIVkVCnflxK
预备知识
高斯滤波器 (Gaussian Filter)
-
最有用的滤波器 (尽管不是最快的)。 高斯滤波是将输入数组的每一个像素点与 高斯内核 卷积将卷积和当作输出像素值。
-
还记得1维高斯函数的样子吗?
假设图像是1维的,那么观察上图,不难发现中间像素的加权系数是最大的, 周边像素的加权系数随着它们远离中间像素的距离增大而逐渐减小。
Note
2维高斯函数可以表达为 :
其中 为均值 (峰值对应位置), 代表标准差 (变量 和 变量 各有一个均值,也各有一个标准差)
BRIEF是2010年一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出的。BRIEF是对已经检测到的特征点进行描述,它是一种二进制编码的描述子,摒弃了利用区域灰度直方图描述特征点的传统方法,大大滴加快了特征描述符的建立速度,同时也大大降低了特征匹配的时间,是一种非常快速非常有潜力的算法。由于BRIEF只是特征描述子,所以实现要得到特征点的位置,可以利用FAST特征点检测算法或者Harris脚点检测算法或SIFT,SURF等算法检测特征点的位置,
FAST: 假定特征点周围的图像强度,通过检测获选像素周围一圈像素来确定是否接收一个特征点。与中心点差异较大的像素如果组成连续的圆弧,并且弧长大于圆周长的3/4,那么认为找到一个特征点。优点:算法可以获得非常快速的特征点检测。
特征点 在计算机视觉中,我们通常需要寻找两张图片上的关键点,因为我们一旦知道了两张图是相关的。就像一个美女脸上面有一个大大的麻子一样。匹配关键点是指在场景中可以很容易辨识出来的特征,这些特征就是这里所指的特征点,图像的特征类型有 :边缘,脚点,半点
灰度直方图 是灰度级的函数(灰度级越多层级越明显也就越清晰。现在的灰度分256级也就是8个bit)
非极大值抑制 在物体检测方面非极大值抑制应用十分广泛,主要的目的是为了消除多余的框框找到最佳的物体检测的位置. 如图虽然几个框框都检测到了人脸但是我不需要这么多的框框我只需要一张最能表达人脸的框框如图所示我只需要最能表达汽车的框框。其原理:非极大值抑制可以理解为局部最大搜索, 即搜索领域范围内的最大值,行人检测后期,对检测出的窗口要执行非极大值抑制进行窗口的融合,从而过滤掉一些内部窗口等,达到窗口融合效果,从而使检测的准确率更高。
ORB 可以看出ORB就是先用FAST检测出来特征点然后用BRIEF对特征点进行描述。
详细介绍 :
FAST特征检测:在局部特征点快速发展的时候,人们对特征的认识也越来越深入,近几年来许多学者提出了许许多多的特征检测算法改进其算法,在众多的特征提取算法中,不乏涌现佼佼者。而在一个系统中,特征提取仅仅是一部分,还要进行诸如配准、提纯、融合等后续算法。这使得实时性不好,降系了统性能。这就是为什么有ORB的原因,为了速度。
FAST的提出者讲FAST角点定义为:若某像素与其周围邻域内足够多的像素点相差较大,则该像素点可能是角点。
可见 点 p 和其周围较多(阈值)的点相差较大则可以认为p就是角点。
1, 上图所示,一个以像素p为中心,半径为3的圆上有16个像素点
2, 定义一个阈值。计算p1, p9, 和中心p的像素差, 若他们的绝对值都小于阈值则p不可能是特征点, 否则当做候选点等待进一步考察
3, 若p是候选点则计算p1, p9, p5, p13和中心p的西欧按摩后四车间啊,若他们的绝对值至少有三个超过阈值, 当做候选点有待下一步考察, 否则pass
4, 若p是候选点则计算p1到p16折16个点和中心点p的像素差, 如果他们至少有9个超过阈值,则是特征点否则pass.
5, 对图像进行非极大值抑制:计算特征点出的FAST得分值, 即socre值,判断以特征点p为中心的一个领域(如3*3或5*5), 计算若有多个特征点,则判断每个特征点的值(16个点和中心差值的绝对值的总和)若p是邻域所有特征点中响应值最大的,则保留;否则,抑制。若邻域内只有一个特征点(角点),则保留。得分计算公式如下(公式中用V表示得分,t表示阈值):
#include <opencv2/core/core.hpp> #include <opencv2/features2d/features2d.hpp> #include <opencv2/highgui/highgui.hpp> #include <cv.h> #include <vector> using namespace cv; using namespace std; int main() { Mat frame=imread("lena.jpg", 1); double t = getTickCount();//当前滴答数 std::vector<KeyPoint> keyPoints; FastFeatureDetector fast(50); // 检测的阈值为50 fast.detect(frame, keyPoints); // 输入图片和装载特征点的容器 drawKeypoints(frame, keyPoints, frame, Scalar(0,0,255), DrawMatchesFlags::DRAW_OVER_OUTIMG); t = ((double)getTickCount() - t)/getTickFrequency(); cout<<"算法用时:"<<t<<"秒"<<endl; imshow("FAST特征点", frame); cvWaitKey(0); return 0; }
BRIEF特征描述
1,解决噪声敏感
BRIEF中采用9*9的高斯算子进行滤波,可以在一定程度上解决噪声敏感的问题,但是一个滤波显然是不够的ORB中提出,利用积分图像来解决在31*31的窗口中,产生一堆随机点之后,以随机点为中心,取5*5的子窗口,比较两个子窗口内的像素和的大小进行二进制编码。而非仅仅由两个随机点决定二进制编码。(这一步用积分图像完成)
2,解决旋转不变形
利用FAST中求出的特征点的主方向 sitar ,对特征点领域进行旋转,Calonder建议现将每块旋转之后,在进行BRIEF描述子的提取,将其进行旋转后进行判别,在二进制编码。
BRIEF具体算法
由于BRIEF仅仅是特征描述子,所以事先要得到特征点的位置,可以利用FAST特征点检测算法或Harris角点检测算法或SIFT、SURF等算法检测特征点的位置。接下来在特征点邻域利用BRIEF算法建立特征描述符。
算法步骤如下:
1、为减少噪声干扰,先对图像进行高斯滤波(方差为2,高斯窗口为9x9)。
2、以特征点为中心,取SxS的邻域窗口。在窗口内随机选取一对(两个)点,比较二者像素的大小,进行如下二进制赋值。
其中,p(x),p(y)分别是随机点x=(u1,v1),y=(u2,v2)的像素值。
3、在窗口中随机选取N对随机点,重复步骤2的二进制赋值,形成一个二进制编码,这个编码就是对特征点的描述,即特征描述子。(一般N=256)
以上便是BRIEF特征描述算法的步骤。
关于一对随机点的选择方法,原作者测试了以下5种方法,其中方法(2)比较好。
这5种方法生成的256对随机点如下(一条线段的两个端点是一对):
利用BRIEF特征进行配准
经过上面的特征提取算法,对于一幅图中的每一个特征点,都得到了一个256bit的二进制编码。接下来对有相似或重叠部分的两幅图像进行配准。
特征配对是利用的汉明距离进行判决:
1、两个特征编码对应bit位上相同元素的个数小于128的,一定不是配对的。
2、一幅图上特征点与另一幅图上特征编码对应bit位上相同元素的个数最多的特征点配成一对。