1.原理
Difference of Gaussian(DOG)是高斯函数的差分。将两幅图像在不同参数下的高斯滤波结果相减,得到DoG图。步骤:
处理一幅图像在不同高斯参数下的DoG
用两个不同的5x5高斯核对图像进行卷积,然后再相减的操作。重复三次得到三个差分图A,B,C。根据DoG求角点
计算出的A,B,C三个DOG图中求图B中是极值的点。图B的点在当前由A,B,C共27个点组成的block中是否为极大值或者极小值。若满足此条件则认为是角点。
2.实现细节
2.1 差分得到DoG图
Mat Process(Mat &img, double sig1, double sig2, Size Ksize)
converTo()
直接读取灰度图会得到CV_8UC1
类型的mat,是单通道uchar型矩阵,因此高斯滤波后相减都是整型非负数据,影响后面进行比较取极值的步骤。所以需要将原本的数据类型转化为CV_32FC1
即单通道float型数据。再进行后续的操作subtract()
两个mat类型相减直接用这个就好了。刚开始查到cvSub函数是老版本的,里面的指针乱七八糟的都挺复杂的,后在官方说明上找到这个c++版本的函数。现在的操作基本都是这个了。
2.2 求取当前block极值得到角点
Mat getExtrema(Mat &A, Mat &B, Mat &C, int thresh){}
block.release();
block.push_back(A(Range(i - 1, i + 2), Range(j - 1, j + 2)));
block.push_back(B(Range(i - 1, i + 2), Range(j - 1, j + 2)));
block.push_back(C(Range(i - 1, i + 2), Range(j - 1, j + 2)));