首页 > 其他 > 详细

SURF特征检测

时间:2020-01-14 15:52:51      阅读:86      评论:0      收藏:0      [点我收藏+]

SERF特征的关键特性:

  1. 特征检测
  2. 尺度空间:缩放到不同的大小或分辨率仍能检测
  3. 选择不变性:光照不变,旋转不变
  4. 特征向量:描述为一个特征向量

DDN过程为:检测、描述、匹配

  工作原理:

  1. 选择感兴趣的区域POI,用Hessian矩阵找到,然后求取梯度
  2. 在不同尺度空间发现关键点,非最大信号压制,把不是局部的最大信号放弃
  3. 发现特征点,求取在某个方向上的特征最大值就找到了特征方向。旋转不变性
  4. 再根据光照不变性生成特征向量

  Hessian矩阵:$\left[ {\begin{array}{*{20}{c}}
{\frac{{\partial {I^2}}}{{\partial {x^2}}}}&{\frac{{\partial {I^2}}}{{\partial x\partial y}}}\\
{\frac{{\partial {I^2}}}{{\partial y\partial x}}}&{\frac{{\partial {I^2}}}{{\partial {{\rm{y}}^2}}}}
\end{array}} \right]$

  用Hessian矩阵寻找POI最好用整数特征点区域连续的浮点数特征计算

技术分享图片

  要近似转换成近似的整数计算如下:

技术分享图片

\[\frac{{{\partial ^2}H}}{{\partial {x^2}}} = \left[ {\begin{array}{*{20}{c}}
{{d_{xx}}}&{{d_{yx}}}&{{d_{sx}}}\\
{{d_{xy}}}&{{d_{yy}}}&{{d_{sy}}}\\
{{d_{xs}}}&{{d_{ys}}}&{{d_{ss}}}
\end{array}} \right]\]

$$\frac{{\partial H}}{{\partial x}} = \left[ {\begin{array}{*{20}{c}}
{{d_x}}\\
{{d_y}}\\
{{d_z}}
\end{array}} \right]$$

  尺度空间如下:中间X表示最大尺度空间

技术分享图片

   Hessian矩阵在尺度空间寻找关键点:$H(x) = H + \frac{{\partial {H^T}}}{{\partial x}}x + \frac{1}{2}{x^T}\frac{{{\partial ^2}{\rm{H}}}}{{\partial {x^2}}}x$(拉格朗日泰勒级数展开形式) 求取Hessian矩阵为0时候的x值$\hat x = - \frac{{{\partial ^2}{{\rm{H}}^{ - 1}}}}{{\partial {x^2}}}\frac{{\partial H}}{{\partial x}}$就是最大值,然后每次移动0.5,不断向这个最大值逼近,这样就在空间尺度找到最大关键点。

  旋转不变性:

                            技术分享图片技术分享图片

  如图所示,在4$ \times $4的方格中,每隔方格为5$ \times $5的像素,用如图2$ \times $2的Haar在5$ \times $5的像素求取dx,dy,得到每个方向的值,然后所有5$ \times $5内的dx加起来,dy加起来,每个5$ \times $5的区域得到一个向量

\[V = \{ \sum {dx,} \sum {\left| {dx} \right|,} \sum {dy,} \sum {\left| {dy} \right|} \} \]

  在4$ \times $4的方格中总共有16个向量。

  原图如下:

技术分享图片

   minHessian = 400的特征点如下:

技术分享图片

    minHessian = 100的特征点如下:

技术分享图片

 

   参考程序如下:

 1 #include<opencv2/opencv.hpp>
 2 #include<opencv2/xfeatures2d.hpp>
 3 #include<iostream>
 4 
 5 using namespace std;
 6 using namespace cv;
 7 using namespace cv::xfeatures2d;
 8  
 9 int main(int argc, char *argv[])
10 {
11     Mat src = imread("H:/cv_code/image/home.jpg",0);
12     if(src.empty())
13     {
14         printf("no image");
15         return -1;
16     }
17     namedWindow("src",CV_WINDOW_AUTOSIZE);
18     imshow("src", src);
19     //Hessian矩阵
20     int minHessian = 400;
21     Ptr <SURF> detector = SURF::create(minHessian);
22     vector <KeyPoint> keyPoints;
23     detector->detect(src,keyPoints,Mat());
24     //绘制关键点
25     Mat keyPoint_result;
26     drawKeypoints(src, keyPoints, keyPoint_result, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
27     namedWindow("src",CV_WINDOW_AUTOSIZE);
28     imshow("keyPoint_result", keyPoint_result);
29     
30     waitKey(0);
31     return 0;
32 }

SURF特征检测

原文:https://www.cnblogs.com/fuzhuoxin/p/12192010.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!