计算机视觉中,我们经常要匹配两幅图像。匹配的的方式就是通过比较两幅图像中的公共特征,比如边,角,以及图像块(blob)等,来对两幅图像进行匹配。在这篇教程中,我们来学习如何在图像中检测harrs特征角。
角是两条边的交叉点,它在两个方向梯度变化明显。我们可以通过这个特征来检测角。下面我们看看harris角的计算方法:
对于灰度图像 ,我们在窗口
内,用x方向的偏移u和y方向的偏移v,扫过所有像素,得到一个图像灰度值的变化和。
表示成矩阵乘法形式:
假设
则有:
对每一个窗口计算得到一个分数,根据分数的大小来判定窗口内是否存在harris特征角,分数R根据下面公式计算得到:
这里:(是矩阵的2个特征值,k是一个指定值,这是一个经验参数,需要实验确定它的合适大小,通常它的值在0.05和0.5之间)。
在opencv中,我们可以通过函数cv::cornerHarris 计算特征角,
C++: void cornerHarris(InputArray src, OutputArray dst, int blockSize, int ksize, double k, intborderType=BORDER_DEFAULT )
Parameters:
下面的代码显示一副图像的harris角检测结果:
//
读入输入图像
cv::Mat image= cv::imread("../church01.jpg",0);
if
(!image.data)
return 0;
// 显示图像
cv::namedWindow("Original Image");
cv::imshow("Original
Image",image);
// 检测 Harris Corners
cv::Mat cornerStrength;
cv::cornerHarris(image,cornerStrength,
3, // neighborhood size
3, // aperture size
0.01);
// Harris parameter
//二值化harris角的检测结果
cv::Mat harrisCorners;
double threshold= 0.0001;
cv::threshold(cornerStrength,harrisCorners,
threshold,255,cv::THRESH_BINARY_INV);
//
显示结果
cv::namedWindow("Harris Corner Map");
cv::imshow("Harris Corner Map",harrisCorners);
下面是程序的运行结果:
程序代码:参考工程文件FirstOpenCV48
原文:http://www.cnblogs.com/mikewolf2002/p/3547436.html