news 2026/2/12 17:38:22

OpenCVSharp:了解几种特征检测

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenCVSharp:了解几种特征检测

前言

前面已经介绍过了OpenCVSharp中封装的几个特征检测算法,其实里面还有很多特征检测算法,不再一篇一篇地介绍了,其它的都放在这一篇,简单过一下,有点印象即可。

FAST特征检测

FAST(Features from Accelerated Segment Test)是一种高效的特征点检测算法,它通过比较候选像素点周围圆形区域上连续像素的强度差异来识别角点特征。该算法的核心思想是:如果某个像素点周围有足够多的连续像素比该点亮或暗足够大的阈值,则认为该点是一个特征点。FAST算法以其计算速度快、实现简单而著称,特别适合需要实时处理的应用场景,如视频跟踪、SLAM(同步定位与地图构建)和增强现实等。相比SIFT、SURF等复杂特征检测算法,FAST在保持较好检测效果的同时,大幅提升了处理速度,使其成为计算机视觉领域中广泛使用的基础特征检测方法之一。

// 读取图像 using Mat imgSrc = new Mat(ImagePath, ImreadModes.Color); using Mat imgGray = new Mat(); using Mat imgDst = imgSrc.Clone(); // 转换为灰度图像 Cv2.CvtColor(imgSrc, imgGray, ColorConversionCodes.BGR2GRAY, 0); // 使用FAST算法检测特征点 // 参数说明:输入图像、阈值、是否启用非极大值抑制 KeyPoint[] keypoints = Cv2.FAST(imgGray, 50, true); // 在图像上绘制检测到的特征点 foreach (KeyPoint kp in keypoints) { imgDst.Circle((Point)kp.Pt, 3, Scalar.Red, -1, LineTypes.AntiAlias, 0); }

其过程就是读取图像、图像灰度化、FAST特征检测与绘制特征点。

现在来看下FAST方法:

public static KeyPoint[] FAST(InputArray image, int threshold, bool nonmaxSupression = true) { if (image == null) { throw new ArgumentNullException("image"); } image.ThrowIfDisposed(); using VectorOfKeyPoint vectorOfKeyPoint = new VectorOfKeyPoint(); NativeMethods.HandleException(NativeMethods.features2d_FAST1(image.CvPtr, vectorOfKeyPoint.CvPtr, threshold, nonmaxSupression ? 1 : 0)); GC.KeepAlive(image); return vectorOfKeyPoint.ToArray(); }

这是OpenCvSharp库中FAST特征检测算法的核心实现函数,用于在灰度图像中快速检测角点特征。

参数名类型含义默认值说明
imageInputArray输入的灰度图像必须是灰度图像,用于检测角点特征
thresholdint强度差异阈值中心像素与周围圆形区域像素的强度差异阈值,值越大检测到的特征点越少但更稳定
nonmaxSupressionbool非极大值抑制true是否对检测到的角点应用非极大值抑制,启用后会消除重复或相近的角点

这样就可以得到一组特征点,如下所示:

绘制出来,如下所示:

FREAK特征检测

FREAK(Fast Retina Keypoint)是一种受人类视网膜视觉系统启发的快速二进制特征描述符,它通过模仿视网膜神经细胞的密集中心-稀疏周围的采样模式来提取图像局部特征。该算法首先使用其他关键点检测器(如ORB、FAST等)定位图像中的显著点,然后在这些点周围构建一个类似视网膜结构的采样模式,通过比较不同采样区域间的像素强度对来生成紧凑的二进制描述符。FREAK描述符具有计算效率高、内存占用小、匹配速度快的特点,同时对旋转、尺度变化和光照变化具有良好的鲁棒性,使其广泛应用于实时图像匹配、物体识别、视觉SLAM和增强现实等计算机视觉任务中。

// 读取图像 using var gray = new Mat(ImagePath, ImreadModes.Grayscale); using var dst = new Mat(ImagePath, ImreadModes.Color); // ORB检测关键点 using var orb = ORB.Create(1000); KeyPoint[] keypoints = orb.Detect(gray); // FREAK计算描述符 using var freak = FREAK.Create(); Mat freakDescriptors = new Mat(); freak.Compute(gray, ref keypoints, freakDescriptors); // 在图像上绘制检测到的特征点 if (keypoints != null) { var color = new Scalar(0, 255, 0); foreach (KeyPoint kpt in keypoints) { float r = kpt.Size / 2; Cv2.Circle(dst, (Point)kpt.Pt, (int)r, color); Cv2.Line(dst, (Point)new Point2f(kpt.Pt.X + r, kpt.Pt.Y + r), (Point)new Point2f(kpt.Pt.X - r, kpt.Pt.Y - r), color); Cv2.Line(dst, (Point)new Point2f(kpt.Pt.X - r, kpt.Pt.Y + r), (Point)new Point2f(kpt.Pt.X + r, kpt.Pt.Y - r), color); } }

先用ORB检测关键点,然后再用FREAK特征检测。

来看下FREAK.Create方法的签名:

public static FREAK Create( bool orientationNormalized = true, bool scaleNormalized = true, float patternScale = 22.0f, int nOctaves = 4, IEnumerable<int>? selectedPairs = null)

这个函数是OpenCV中FREAK特征描述符的工厂方法,用于创建和配置FREAK描述符实例。

查看参数含义:

参数名类型默认值含义说明
orientationNormalizedbooltrue启用方向归一化,使描述符对图像旋转具有不变性
scaleNormalizedbooltrue启用尺度归一化,使描述符对图像缩放具有不变性
patternScalefloat22.0f描述符模式的缩放因子,控制采样模式的整体大小
nOctavesint4检测关键点覆盖的八度组数量,决定尺度范围
selectedPairsIEnumerable?null用户自定义的采样对集合,可优化性能或适应特定场景

再来看下Compute方法的签名:

public virtual void Compute(InputArray image, ref KeyPoint[] keypoints, OutputArray descriptors)

该函数接收输入图像和关键点数组,为每个关键点计算对应的特征描述符,并返回描述符矩阵。

效果:

KAZE/AKAZE特征检测

KAZE和AKAZE是两种先进的图像特征检测算法,用于识别图像中的关键点并提取其描述符。KAZE(Keyframes of Accelerated Speeded-up Robust Features)采用非线性尺度空间构建方法,通过非线性扩散滤波来检测特征点,对图像模糊和噪声具有出色的鲁棒性。AKAZE(Accelerated-KAZE)是KAZE的优化版本,使用快速显式扩散(FED)算法显著提高了计算速度,同时保持了特征检测的质量。这两种算法都能在旋转、缩放和亮度变化等条件下稳定地检测特征点,广泛应用于图像匹配、物体识别、三维重建和增强现实等计算机视觉任务中。

// 创建KAZE和AKAZE特征检测器 using var kaze = KAZE.Create(); using var akaze = AKAZE.Create(); var kazeDescriptors = new Mat(); var akazeDescriptors = new Mat(); KeyPoint[] kazeKeyPoints = null, akazeKeyPoints = null; // 测量KAZE处理时间 var kazeTime = MeasureTime(() => kaze.DetectAndCompute(gray, null, out kazeKeyPoints, kazeDescriptors)); // 测量AKAZE处理时间 var akazeTime = MeasureTime(() => akaze.DetectAndCompute(gray, null, out akazeKeyPoints, akazeDescriptors)); // 创建结果图像 var dstKaze = new Mat(); var dstAkaze = new Mat(); // 读取彩色图像用于绘制特征点 using var colorImage = new Mat(ImagePath, ImreadModes.Color); // 绘制KAZE特征点 Cv2.DrawKeypoints(colorImage, kazeKeyPoints, dstKaze); // 绘制AKAZE特征点 Cv2.DrawKeypoints(colorImage, akazeKeyPoints, dstAkaze)

查看KAZE.Create函数签名:

public static KAZE Create( bool extended = false, bool upright = false, float threshold = 0.001f, int nOctaves = 4, int nOctaveLayers = 4, KAZEDiffusivityType diffusivity = KAZEDiffusivityType.DiffPmG2)

这是OpenCV中KAZE特征检测器的工厂方法实现,用于创建和配置KAZE算法实例。

参数名参数含义默认值
extended是否启用扩展描述符(128字节)false
upright是否使用直立描述符(非旋转不变)false
threshold检测器响应阈值0.001f
nOctaves图像最大金字塔层数4
nOctaveLayers每个尺度层的子级别数量4
diffusivity扩散类型(DIFF_PM_G1, DIFF_PM_G2, DIFF_WEICKERT, DIFF_CHARBONNIER)KAZEDiffusivityType.DiffPmG2

查看AKAZE.Create函数签名:

public static AKAZE Create(AKAZEDescriptorType descriptorType = AKAZEDescriptorType.MLDB, int descriptorSize = 0, int descriptorChannels = 3, float threshold = 0.001f, int nOctaves = 4, int nOctaveLayers = 4, KAZEDiffusivityType diffusivity = KAZEDiffusivityType.DiffPmG2)

这是OpenCV中AKAZE特征检测器的工厂方法实现,用于创建和配置AKAZE算法实例。AKAZE(Accelerated-KAZE)是KAZE算法的加速版本,通过快速显式扩散(FED)算法提高了计算速度。

参数名参数含义
descriptorType描述符类型(DESCRIPTOR_KAZE, DESCRIPTOR_KAZE_UPRIGHT, DESCRIPTOR_MLDB, DESCRIPTOR_MLDB_UPRIGHT)
descriptorSize描述符的位数(0表示完整大小)
descriptorChannels描述符中的通道数(1, 2, 3)
threshold检测器响应阈值
nOctaves图像最大金字塔层数
nOctaveLayers每个尺度层的子级别数量
diffusivity扩散类型(DIFF_PM_G1, DIFF_PM_G2, DIFF_WEICKERT, DIFF_CHARBONNIER)

查看DrawKeypoints函数签名:

public static void DrawKeypoints( InputArray image, IEnumerable<KeyPoint> keypoints, InputOutputArray outImage, Scalar? color = null, DrawMatchesFlags flags = DrawMatchesFlags.Default)

这个函数是OpenCV中用于在图像上绘制特征点的静态方法。它接受源图像和检测到的关键点列表,然后在输出图像上可视化这些特征点。

参数名参数含义
image源图像
keypoints从源图像中检测到的关键点集合
outImage输出图像,其内容取决于flags参数定义的绘制方式
color特征点的颜色,默认为null表示使用随机颜色
flags绘制特征的标志,由DrawMatchesFlags枚举定义,控制特征点的绘制样式

效果:

Star特征检测

Star特征检测是一种基于图像强度的特征点检测算法,它通过在不同尺度上寻找图像中的"星形"结构来识别关键点。该算法使用多尺度分析技术,能够检测不同大小的特征点,对图像中的角点和斑点都很敏感。Star检测器的工作原理是首先将图像转换为灰度图,然后通过计算每个像素点在不同尺度下的响应值来识别具有显著特征的点,最后应用非极大值抑制来筛选出最优的特征点。这种检测器特别适用于图像配准、物体识别、三维重建和图像拼接等计算机视觉应用,因为它能够提供稳定且可重复的特征点,即使在图像发生尺度变化或轻微旋转时也能保持较好的检测效果。

// 读取图像 using Mat imgSrc = new Mat(ImagePath, ImreadModes.Color); using Mat imgGray = new Mat(); using Mat imgDst = imgSrc.Clone(); // 转换为灰度图像 Cv2.CvtColor(imgSrc, imgGray, ColorConversionCodes.BGR2GRAY, 0); // 使用StarDetector算法检测特征点 StarDetector detector = StarDetector.Create(MaxSize, ResponseThreshold, LineThresholdProjected, LineThresholdBinarized, SuppressNonmaxSize); KeyPoint[] keypoints = detector.Detect(imgGray); // 在图像上绘制检测到的特征点 if (keypoints != null) { var color = new Scalar(0, 255, 0); // 绿色 foreach (KeyPoint kpt in keypoints) { float r = kpt.Size / 2; Cv2.Circle(imgDst, (Point)kpt.Pt, (int)r, color); Cv2.Line(imgDst, (Point)new Point2f(kpt.Pt.X + r, kpt.Pt.Y + r), (Point)new Point2f(kpt.Pt.X - r, kpt.Pt.Y - r), color); Cv2.Line(imgDst, (Point)new Point2f(kpt.Pt.X - r, kpt.Pt.Y + r), (Point)new Point2f(kpt.Pt.X + r, kpt.Pt.Y - r), color); } }

使用过程就是读取图像、转换为灰度图像、使用StarDetector算法检测特征点与在图像上绘制检测到的特征点。

查看StarDetector.Create函数签名:

public static StarDetector Create( int maxSize = 45, int responseThreshold = 30, int lineThresholdProjected = 10, int lineThresholdBinarized = 8, int suppressNonmaxSize = 5)

这个函数是 OpenCV 中 StarDetector 类的静态工厂方法,用于创建一个 Star 特征检测器的实例。

参数名默认值含义
maxSize45控制检测的最大特征点尺寸,较大的值可以检测更大的特征结构
responseThreshold30响应阈值,用于过滤掉响应值低于此阈值的特征点,提高检测质量
lineThresholdProjected10投影线阈值,用于控制线状结构的检测灵敏度
lineThresholdBinarized8二值化线阈值,进一步细化线状特征的检测标准
suppressNonmaxSize5非极大值抑制的邻域大小,用于在局部区域内保留最强的特征点

效果:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/6 18:02:24

LobeChat公益活动策划方案生成

LobeChat 公益应用技术实践&#xff1a;让AI真正服务于人 在偏远山区的乡村小学里&#xff0c;一个孩子低声说&#xff1a;“我不想上学了。” 没有老师在场&#xff0c;也没有心理咨询师能立刻赶到——但屏幕另一端的AI助手听到了这句话。它没有机械地回答“为什么呢&#xf…

作者头像 李华
网站建设 2026/2/11 14:16:02

LobeChat智能排班建议生成算法初探

LobeChat智能排班建议生成算法初探 在人力资源管理日益智能化的今天&#xff0c;一个看似简单却极其耗时的任务——排班&#xff0c;正成为企业效率提升的关键瓶颈。尤其在医疗、零售、客服中心等需要轮班作业的行业中&#xff0c;管理者常常面临这样的困境&#xff1a;既要满足…

作者头像 李华
网站建设 2026/2/11 11:20:36

10.3 当前挑战:标准化、模型保密性、系统规划

10.3 当前挑战:标准化、模型保密性、系统规划 构网型变流器的技术验证与初步工程应用已证明了其在提升新型电力系统稳定性方面的核心价值。然而,其从“可用”到“可靠、可管、可大规模部署”的广泛普及,仍面临来自技术规范、商业生态和系统设计方法三个维度的深层次挑战。本…

作者头像 李华
网站建设 2026/2/8 4:31:48

互联网大厂Java求职者面试实录:严肃面试官与搞笑谢飞机的三轮问答

互联网大厂Java求职者面试实录&#xff1a;严肃面试官与搞笑谢飞机的三轮问答 本文通过一个互联网大厂Java求职面试的故事场景&#xff0c;展现了面试官与求职者谢飞机之间的精彩问答。面试涉及Java核心知识、JUC、JVM、多线程、线程池、HashMap、ArrayList、Spring、SpringBoo…

作者头像 李华
网站建设 2026/2/9 7:21:08

提示词工程完全指南:从零开始掌握大模型交互核心技术

本文详细介绍提示词工程这一优化大模型的核心技术&#xff0c;包括基本概念、构成要素及多种使用示例&#xff08;文本总结、信息提取、逻辑推理等&#xff09;。深入解析零样本提示、少样本提示、链式思考、自我一致性和思维树等进阶调优技巧&#xff0c;并探讨Prompt攻击与防…

作者头像 李华
网站建设 2026/2/7 19:46:46

C盘清理技巧分享

引言C盘空间不足会导致系统卡顿、软件运行异常甚至更新失败。定期清理是维持系统高效运行的关键&#xff0c;需结合基础操作与进阶优化。基础清理方法删除临时文件 通过Windows内置“磁盘清理”工具&#xff08;搜索并运行cleanmgr&#xff09;&#xff0c;勾选“临时文件”“下…

作者头像 李华