角点检测用于获取图像特征,以支撑运动检测、目标识别、图像匹配等方面的应用。常用的角点检测算法包括Kitchen-Rosenfeld算法、Harris算法、KLT算法、SUSAN算法等,本文学习并测试Harris角点检测算法。
关于Harris算法的数学原理请见参考文献1的第18、19课,其总共花50分钟左右讲解算法数学原理。OpenCvSharp中Harris算法的函数原型如下:
public static void CornerHarris(InputArray src, OutputArray dst, int blockSize, int ksize, double k, BorderTypes borderType = BorderTypes.Reflect101)
其中:
-src,源图像,带检测角点的图像,一般为灰度图,Mat类型;
-dst,保存角点检测几个,其类型和尺寸与src相同;
-blockSize,邻域大小,详见参考文献3-4;
-ksize,Sobel算子的孔径大小,只能取1、3、5、7(参考文献3);
-k,权重系数,一般取0.04~0.06(参考文献1)。
实际测试过程中,将角点检测结果归一化处理,然后检测超过指定阈值的位置,并在原图中标识,主要代码及程序运行效果如下所示:
using Mat imgSrc = Cv2.ImRead(lblMsg.Text);
using Mat imgGray = new Mat();
Cv2.CvtColor(imgSrc, imgGray, ColorConversionCodes.BGR2GRAY);using Mat imgDest = new Mat(imgGray.Size(), MatType.CV_32FC1);Cv2.CornerHarris(imgGray, imgDest, blockSize, ksize, k);using Mat imgNorm =new Mat();
Cv2.Normalize(imgDest, imgNorm, 0, 255, NormTypes.MinMax);for (int i = 0; i < imgNorm.Rows; i++)
{for (int j = 0; j < imgNorm.Cols; j++){if (imgNorm.At<float>(i, j) > thrould){Cv2.Circle(imgSrc, j, i, 5, color);}}
}Cv2.ImShow("角点检测", imgSrc);
参考文献:
[1]花12800买来的【OpenCV全套】教程,花费156个小时整理的OpenCV计算机视觉基础版全套视频教程,涵盖核心知识点,全程干货,无废话
[2]OpenCV3编程指南
[3]https://blog.csdn.net/holybin/article/details/40984955
[4]https://www.cnblogs.com/kbqLibrary/p/12482664.html