SERF(speed up robust feature )特征的关键特性:
DDN过程为:检测、描述、匹配
工作原理:
选择感兴趣的区域POI,用Hessian矩阵找到,然后求取梯度
在不同尺度空间发现关键点,非最大信号压制,把不是局部的最大信号放弃
发现特征点,求取在某个方向上的特征最大值就找到了特征方向。旋转不变性
再根据光照不变性生成特征向量
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的特征点如下:
相关函数解释:
static Ptr
int nOctaves = , //表示在4个尺度空间
int nOctaveLayers = , //每个尺度空间的层数
bool extended = false, //扩展描述符标志(true使用扩展的128个元素的描述符,false使用64个元素的描述符)
bool upright = false //旋转的特征标志(true不计算方向,false计算方向)
);
/****************************************************************/
detect( InputArray image, //图像
vector
InputArray mask=noArray() //指定在哪里寻找关键点的掩码(必须是在感兴趣区域中具有非零值的8位整数矩阵)
);
/****************************************************************/
drawKeypoints(InputArray image, //源图像
vector
InputOutputArray outImage,//输出图像
const Scalar& color=Scalar::all(-), //关键点的颜色
int flags=DrawMatchesFlags::DEFAULT //设置绘图功能的标志
);
参考程序如下:
#include
#include
#include
using namespace std;
using namespace cv;
using namespace cv::xfeatures2d;
int main(int argc, char *argv[])
{
Mat src = imread("H:/cv_code/image/home.jpg",);
if(src.empty())
{
printf("no image");
return -;
}
namedWindow("src",CV_WINDOW_AUTOSIZE);
imshow("src", src);
//Hessian矩阵
int minHessian = ;
Ptr
vector
detector->detect(src,keyPoints,Mat());
//绘制关键点
Mat keyPoint_result;
drawKeypoints(src, keyPoints, keyPoint_result, Scalar::all(-), DrawMatchesFlags::DEFAULT);
namedWindow("src",CV_WINDOW_AUTOSIZE);
imshow("keyPoint_result", keyPoint_result);
waitKey();
return ;
}
手机扫一扫
移动阅读更方便
你可能感兴趣的文章