在检测兴趣点的时候,角点可以作为一个有趣的方案。这就是因为角点在图像中几乎随处可见。
在这里,我们将用Harris角点检测方案进行检测。
我们在这里选择声明一个HarrisDetector类进行角点的检测,我们先说一下它的代码实现。
第一部分是计算Harris值
//Harris 计算
cv::cornerHarris(image, cornerStrength,
neighbourhood,// neighborhood size
aperture, // 孔径大小
k); // Harris 参数
//内部阈值计算
//配合函数minMaxLoc设置的变量,但后续并没有用处
double minStrength;
cv::minMaxLoc(cornerStrength, &minStrength, &maxStrength);
// 局部最大值检测
cv::Mat dilated;
cv::dilate(cornerStrength, dilated, cv::Mat());
cv::compare(cornerStrength, dilated, localMax, cv::CMP_EQ);
为了检测Harris角点,我们先计算每个像素处的Harris值,这里用到的OpenCV集成函数有:
void cornerHarris( InputArray src, OutputArray dst, int blockSize,
int ksize, double k,
int borderType = BORDER_DEFAULT );
cornerHarris函数用来检测角点并返回储存着角点信息的dst图像矩阵
第一个参数用来设定输入图像
第二个参数返回信息矩阵
第三个参数为窗口大小,也就是Harris角点检测时所用到的窗口的大小
第四个参数为核大小,由于这里我们采用的是Sobel算法检测梯度,因此这个是Sobel中需要的核检测大小
第五个参数为计算窗口中是否存在R值时所用的计算参数,一般可以选择0.01
第六个参数为插值方法