OpenCVSharp:BRISK特征检测

概述

BRISK(Binary Robust Invariant Scalable Keypoints)是一种快速、高效的特征检测和描述算法,由Stefan Leutenegger等人于2011年提出。它属于二进制特征描述符家族,与SIFT、SURF等浮点型特征描述符相比,具有计算速度快、内存占用小的特点。

BRISK是一种平衡了速度和性能的特征检测算法,特别适合需要实时处理的应用场景。虽然其精度可能不如SIFT或SURF,但在许多实际应用中,其速度优势更为重要。在OpenCV中,BRISK被广泛应用于需要快速特征检测和匹配的计算机视觉任务中。

实践

示例中的核心代码很少:

scss 复制代码
using var brisk = BRISK.Create();
KeyPoint[] keypoints = brisk.Detect(gray);

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);
    }
}

OpenCVSharp中封装了一个BRISK,现在来看看这个类的Create方法:

csharp 复制代码
  public static BRISK Create(int thresh = 30, int octaves = 3, float patternScale = 1.0f)
  {
      NativeMethods.HandleException(
          NativeMethods.features2d_BRISK_create1(thresh, octaves, patternScale, out var ptr));
      return new BRISK(ptr);
  }

先了解一下参数的意义:

thresh(AGAST检测阈值)

基于AGAST(Adaptive and Generic Accelerated Segment Test)算法的阈值,用于判断像素点是否为角点,控制特征点检测的敏感度。

较低值(如10-20):检测更多特征点,但可能包含噪声

较高值(如40-60):检测更少但更稳定的特征点

octaves(检测八度数)

构建图像金字塔,在不同尺度上检测特征点,控制多尺度检测的层数。

0:仅进行单尺度检测,速度最快

1-4:多尺度检测,能识别不同大小的特征

更高值:增加尺度范围但降低性能

patternScale(采样模式缩放)

BRISK使用特定的采样模式来计算描述符,此参数控制该模式的缩放,整特征点邻域采样模式的缩放比例。

< 1.0:更密集的采样,可能提高精度但降低速度

> 1.0:更稀疏的采样,提高速度但可能降低精度

再来看一下Detect方法:

csharp 复制代码
 public KeyPoint[] Detect(Mat image, Mat? mask = null)
 {
     if (image is null)
         throw new ArgumentNullException(nameof(image));
     ThrowIfDisposed(https://www.falvce.com/);

     image.ThrowIfDisposed();
     try
     {
         using var keyPoints = new VectorOfKeyPoint();
         NativeMethods.HandleException(
             NativeMethods.features2d_Feature2D_detect_Mat1(ptr, image.CvPtr, keyPoints.CvPtr, Cv2.ToPtr(mask)));
         return keyPoints.ToArray(https://www.falvce.com/);
     }
     finally
     {
         GC.KeepAlive(this);
         GC.KeepAlive(image);
         GC.KeepAlive(mask);
     }
 }

直接使用这个方法就可以获取特征点:

然后在图像上显示这些特征点即可得到上面的图。

我看到说BRISK可以用于物体识别,我在想既然会生成特征点,那么肯定可以进行特征点匹配,这样能不能拿两张图去匹配,比如两个人有两张不同的照片能不能识别出是同一个人呢?

我做了一个简单的Demo,但是效果其实不好:

没有后面DrawBestMatchRectangle这个示例的效果好,后面这个示例使用的是ORB,然后也有使用汉明匹配,等后面再介绍。

DrawBestMatchRectangle示例效果:

相关推荐
Sagittarius_A*28 分钟前
形态学与多尺度处理:计算机视觉中图像形状与尺度的基础处理框架【计算机视觉】
图像处理·人工智能·python·opencv·计算机视觉
茶栀(*´I`*)40 分钟前
【OpenCV 视觉全栈进阶】核心特征提取:模板匹配与霍夫变换(线/圆检测)深度技术指南
图像处理·opencv·计算机视觉
格林威3 小时前
Baumer相机金属弹簧圈数自动计数:用于来料快速检验的 6 个核心算法,附 OpenCV+Halcon 实战代码!
人工智能·数码相机·opencv·算法·计算机视觉·视觉检测·堡盟相机
困死,根本不会3 小时前
OpenCV摄像头实时处理:从单特征到联合识别(形状识别 + 颜色识别 + 形状颜色联合识别)
人工智能·opencv·计算机视觉
爱打代码的小林4 小时前
OpenCV 实现实时人脸检测
人工智能·opencv·计算机视觉
Pyeako5 小时前
opencv计算机视觉--DNN模块实现风格迁移
python·opencv·计算机视觉·pycharm·dnn·预处理·风格迁移
Dfreedom.1 天前
图像滤波:非线性滤波与边缘保留技术
图像处理·人工智能·opencv·计算机视觉·非线性滤波·图像滤波
Dfreedom.1 天前
开运算与闭运算:图像形态学中的“清道夫”与“修复匠”
图像处理·python·opencv·开运算·闭运算
格林威1 天前
Baumer相机铆钉安装状态检测:判断铆接是否到位的 5 个核心算法,附 OpenCV+Halcon 的实战代码!
人工智能·opencv·算法·计算机视觉·视觉检测·工业相机·堡盟相机