C#调用OpenCvSharp实现图像的角点检测

角点检测用于获取图像特征,以支撑运动检测、目标识别、图像匹配等方面的应用。常用的角点检测算法包括Kitchen-Rosenfeld算法、Harris算法、KLT算法、SUSAN算法等,本文学习并测试Harris角点检测算法。
  关于Harris算法的数学原理请见参考文献1的第18、19课,其总共花50分钟左右讲解算法数学原理。OpenCvSharp中Harris算法的函数原型如下:

csharp 复制代码
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)。
  实际测试过程中,将角点检测结果归一化处理,然后检测超过指定阈值的位置,并在原图中标识,主要代码及程序运行效果如下所示:

csharp 复制代码
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

相关推荐
金增辉4 个月前
C#图像处理实例1:opencvsharp获取轮廓凸包
图像处理·opencv·c#·opencvsharp
beyond谚语5 个月前
三、Mat、Bitmap和Image数据类型之间的转换(OpenCvSharp)
opencvsharp
gc_22999 个月前
测试C#使用OpenCvSharp从摄像头获取图片
c#·图片·摄像头·opencvsharp
Imageshop1 年前
Opencv中goodFeaturesToTrack函数(Harris角点、Shi-Tomasi角点检测)算子速度的进一步优化(1920*1080测试图11ms处理完成)。
goodfeaturestotrack·harris·shi-tomasi
anech1 年前
教你如何实现图片特征向量提取与相似度计算
opencv·向量·opencvsharp·向量搜索·图片相似度·相似度计算·图片特征提取
马儿不吃草1 年前
OpenCVSharp入门学习①-获取本地摄像头数据
c#·opencvsharp