兴趣点领域的归一化问题
最近在做特征描述问题,那首先第一步就是根据已知的兴趣点提取方法提取兴趣点:如harris ,sift, surf, orb ,fast等,
在opencv中这些方法最终的结果都会被保存在KeyPoint结构中,下面我们不防看下这个结构中都有什么东东
KeyPoint::KeyPoint(float x, float y, float _size, float _angle=-1, float _response=0, int _octave=0, int _class_id=-1)
Parameters:
- x – x-coordinate of the keypoint
- y – y-coordinate of the keypoint
- _pt – x & y coordinates of the keypoint
- _size – diameter of the meaningful keypoint neighborhood 对于这个参数,我不是特别清楚,暂时的理解是:如使用sift进行特征检测时,我们使用到了高斯金字塔,因为不同尺度具有不同的加权窗口,这里的size即加权窗口的大小,
- _angle – keypoint orientation
- _response – keypoint detector response on the keypoint (that is, strength of the keypoint)
- _octave – pyramid octave in which the keypoint has been detected
- _class_id – object id
接下来我们需要将得到的不同大小的区域归一化的一个特定大小的patch块,设为patchSize
那么缩放尺度S = _size / patchSize
当时刚看到这个公式的时候以为写错了,因为我认为 S = patchSize / _size
想想,如果_size = 20 , patchSize = 40 , 我们想在要将大小为_size*_size的patch块缩放到大小为patchSize*patchSize的patch块
如果按照我原来的想法的话,那S = 2,这显然是不对的,如果S = 2,那么就想当于图片要放大,即相同大小下图片表示的信息更少,即某些信息会丢失,这显然是不对的
我们现在是要将小图片的内容放到大图片中表示,显然相同大小的块中包含更多的细节,因此s = _size / patchSize = 0.5
接下来介绍如果得到归一化的patch块,需要使用到前面讲的内容:仿射变换详解 warpAffine
仿射变换需要知道以下参数:
旋转角度:Θ
变换尺度:S
1、将兴趣点(kpt.pt.x , kpt.pt.y ) 作为图片的原点 平衡(-x ,- y)
2、旋转图片 : Θ
3、尺度缩放 : S
由于我们要得到以兴趣点kpt.pt为中心,大小为patchSize*patchSize的 patch块,又由于图片处理中以原点作为处理的起点,因此在这里需要将图片的原点设为patch块的左上角,
即需要平移(-patchSize / 2 , -patchSize / 2 ),而不需要将图片的原点设为图片的左上角(这里理解清楚非常重要)
4、平移 : (-patchSize / 2 , -patchSize / 2 )
那么变换矩阵
PS: 今天这个公式让我推了一天,只有基础知识扎实了,才能提高学习速度哇