.Net AI学习笔记系列
第七章 OpenCVSharp实操——角点检测
前言
本文主要介绍角点检测,角点检测(Corner Detection)是计算机视觉和图像处理中的一个重要任务,它的目的是在数字图像中识别出具有显著特征的点,这些点通常位于图像中物体的边缘或角落。角点检测在许多应用中都有重要作用,如运动跟踪、图像拼接、目标识别等。
一、OpenCVSharp实操——角点检测
从人眼来看,角点是图像亮度发生剧烈变化的点 或 边缘曲线上曲率为极大值的点。OpenCV 中 Harris 角点检测的函数为:
void cornerHarris (
InputArray src, // 输入图像 (单通道,8位或浮点型)
OutputArray dst, // 输出图像 (类型 CV_32FC1,大小同 src)
int blockSize, // 邻域大小
int ksize, // Sobel 算子的孔径大小
double k, // 经验参数,取值范围 0.04 ~ 0.06
int borderType = BORDER_DEFAULT // 边界模式
)
二、步骤
1.开发工具
VS2019+.net 4.8+OpenCvSharp4
2.引入库
Install-Package OpenCvSharp4
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OpenCvSharp;
using OpenCvSharp.Extensions;
3.示例代码
代码如下(示例):
//角点检测
private void button1_Click(object sender, EventArgs e)
{
// 读取图像
Mat src = BitmapConverter.ToMat((Bitmap)this.pictureBox1.Image);
//灰度化图像
Mat grayImg = new Mat();
Cv2.CvtColor(src, grayImg, ColorConversionCodes.BGR2GRAY);
//Cv2.ImShow("灰度图像", grayImg);
// Harris 角点检测参数
int kThresh = 50;
int kBlockSize = 3;
int kApertureSize = 3;
double k = 0.04;
// 进行 Harris 角点检测
var dst = new Mat();
Cv2.CornerHarris(grayImg, dst, kBlockSize, kApertureSize, k);
// 归一化检测结果
var dst_norm = new Mat();
var dst_norm_scaled = new Mat();
Cv2.Normalize(dst, dst_norm, 0, 255, NormTypes.MinMax, MatType.CV_32FC1);
Cv2.ConvertScaleAbs(dst_norm, dst_norm_scaled);
//Cv2.ImShow("归一化图像", dst_norm_scaled);
// 描绘出检测出来的角点
for (int y = 0; y < dst_norm.Rows; y++)
{
for (int x = 0; x < dst_norm.Cols; x++)
{
int val = (int)dst_norm.At<float>(y, x);
if (val > kThresh)
{
Cv2.Circle(src, new OpenCvSharp.Point(x, y), 2, Scalar.Red, 5);
}
}
}
//显示效果图
this.pictureBox2.Image = BitmapConverter.ToBitmap(src);
this.pictureBox2.Refresh();
}
4.运行效果
总结
本文使用的是Harris角点检测:Harris算法是一种基于灰度图像的角点检测方法,它通过计算像素点周围区域的灰度变化来检测角点。Harris算法对于图像的旋转、缩放和光照变化具有较好的鲁棒性。