• 【youcans 的 OpenCV 例程 300篇】244. 特征检测之 BRIEF 特征描述


    『youcans 的 OpenCV 例程300篇 - 总目录』


    【youcans 的 OpenCV 例程 300篇】244. 特征检测之 BRIEF 特征描述


    6.7.1 算法简介

    二进制鲁棒独立的特征描述 BRIEF (Binary Robust Independent Elementary Features),对检测到的特征点构造特征描述子,其特点是直接生成二进制字符串作为特征描述符,效率很高。

    SIFT 使用 128 维的浮点数作为特征描述符,共有 512 个字节;SURF 使用 64/128 维特征描述符,共有 256/512 个字节。由于特征点常常高达数千个,这些特征描述向量所占用的内存很大,而且特征点匹配所需的时间也很长。这些特征描述符往往存在大量的数据冗余,可以进行数据压缩或转换为二进制字符串,以减少内存和加快匹配。

    BRIEF 描述子提供了一种直接生成二进制字符串的特征描述方法,加快了建立特征描述符的速度,也极大的降低了特征描述符的内存占用和特征匹配的时间。因此,BRIEF 算子是一种对特征点描述符计算和匹配的快速方法。

    BRIEF 描述子的思想是在关键点 P 的周围以一定模式选取 N 个点对,将 N 个点对的比较结果组合起来作为描述子。为了保持选点的一致性,工程上采用特殊设计的固定模式。

    BRIEF 描述子的实现步骤为:

    (1)对图像进行高斯滤波(σ=2),以消除噪声的干扰;
    (2)以特征点为中心,选取 s*s 的正方形邻域窗口;
    (3)按照预定的随机算法,从邻域窗口中随机选取 2个点生成点对 ,比较像素值大小,得到一个二进制数 0/1;
    (4)重复(3)若干次(如 256次),形成一个二进制编码,即为特征点的 BRIEF 描述子。

    在这里插入图片描述

    BRIEF 描述子的优点和不足:

    (1)优点:BRIEF 建立描述子的速度很快,生成的二进制描述子便于高速匹配,且便于在硬件上实现。

    生成 BRIEF 的速度很快,SURF 计算 512 个特征点的描述子用时 335ms,BRIEF 仅需 8.18ms;SURF 描述子匹配用时 28.3ms,BRIEF 仅需 2.19 ms。

    (2)缺点:不具备旋转不变性,不具备尺度不变性,对噪声比较敏感。

    在旋转程度较小的图像中,使用 BRIEF 特征描述子的匹配质量非常高,大多数情况优于 SIFT 和 SURF;但对于旋转大于 30° 的图像,BRIEF 特征描述子的匹配成功率极低,接近于 0。

    BRIEF 算法不涉及特征点检测方法,需要配合 FAST、SURF、CenSurE 等特征点检测算法使用。


    6.7.2 OpenCV 中的 BRIEF 类

    OpenCV 提供了丰富的特征检测算法,而且继承了 cv::Feature2D 类,采用了统一的定义和封装。

    OpenCV 中提供 cv::xfeatures2d::BriefDescriptorExtractor 类实现 BRIEF Detector 方法,继承了 cv::Feature2D 类,通过 create 静态方法创建。

    BriefDescriptorExtractor 类的构造函数为:

    static Ptr< BriefDescriptorExtractor > 	create (int bytes=32, bool use_orientation=false)
    
    • 1

    在 Python 语言中,OpenCV 提供了接口函数 cv.xfeatures2d.BriefDescriptorExtractor.create(), 实例化 BriefDescriptorExtractor 类。

    cv.xfeatures2d.BriefDescriptorExtractor.create([, bytes=32, use_orientation=false]) → retval
    cv.xfeatures2d.BriefDescriptorExtractor_create([, bytes=32, use_orientation=false]) → retval
    brief.compute(image, keypoints[, descriptors=None]) → keypoints, descriptors
    
    • 1
    • 2
    • 3

    参数说明:

    • image:输入图像,单通道
    • bytes:描述符的字节长度,可选项 16/32/64,默认值 32
    • use_orientation:采样模式是否使用关键点方向,可选项,默认为 false
    • keypoints :检测到的关键点,是一个特殊的数据结构
    • descriptors:关键点的描述符,Numpy 数组,形状为(n, bytes)

    注意事项:

    • 函数 cv.FastFeatureDetector.create() 实例化 FastFeatureDetector 类,构造一个 FastFeatureDetector 对象。
    • bytes 是描述符的字节长度,注意 1个字节为 8bits,因此 bytes=16/32/64 表示使用的二进制编码长度 n 为 128/256/512。
    • descriptors 是 BRIEF 特征描述符的数组,形状为(n, bytes),n 是关键点的数量,bytes 是描述符的字节长度 16/32/64。

    例程 14.26:特征检测之 BRIEF 特征描述

        # 14.26 特征检测之 BRIEF 特征描述
        # # 读取基准图像
        img = cv.imread("../images/book01.jpg", flags=1)  # 基准图像
        gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)  # (425, 558)
        height, width = gray.shape[:2]
        print("shape of image: ", height, width)
    
        # SIFT 关键点检测 + SIFT 特征描述
        # sift = cv.xfeatures2d.SIFT_create()  # OpenCV 早期版本
        sift = cv.SIFT.create()  # sift 实例化对象
        kpSift = sift.detect(gray, None)  # 关键点检测,kp 为关键点信息(包括方向)
        print("shape of keypoints: ", len(kpSift))  # 775
        imgSift1 = cv.drawKeypoints(img, kpSift, None)  # 只绘制关键点位置
        imgSift2 = cv.drawKeypoints(img, kpSift, None, flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)  # 绘制关键点大小和方向
    
        # SIFT 关键点检测 + BRIEF 特征描述
        brief = cv.xfeatures2d.BriefDescriptorExtractor_create()  # BRIEF 特征描述
        kpBrief, des = brief.compute(img, kpSift)  # 对 SIFT 检测的关键点,通过 BRIEF 计算描述子
        imgBrief1 = cv.drawKeypoints(img, kpBrief, None)
        imgBrief2 = cv.drawKeypoints(img, kpBrief, None, flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
        print(des.shape)
    
        # STAR 关键点检测 + BRIEF 特征描述
        star = cv.xfeatures2d.StarDetector_create()  # STAR 特征检测
        brief2 = cv.xfeatures2d.BriefDescriptorExtractor_create()  # BRIEF 特征描述
        kpStar = star.detect(img, None)  # STAR 特征检测
        kpBriefStar, des = brief.compute(img, kpStar)  # 通过 BRIEF 计算描述子
        imgBriefS1 = cv.drawKeypoints(img, kpBriefStar, None)
        imgBriefS2 = cv.drawKeypoints(img, kpBriefStar, None, flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
        print(des.shape)
    
        plt.figure(figsize=(10, 6))
        plt.subplot(231), plt.title("SIFT keypoints")
        plt.axis('off'), plt.imshow(cv.cvtColor(imgSift1, cv.COLOR_BGR2RGB))
        plt.subplot(234), plt.title("SIFT scaled keypoints")
        plt.axis('off'), plt.imshow(cv.cvtColor(imgSift2, cv.COLOR_BGR2RGB))
        plt.subplot(232), plt.title("SIFT & BRIEF keypoints")
        plt.axis('off'), plt.imshow(cv.cvtColor(imgBrief1, cv.COLOR_BGR2RGB))
        plt.subplot(235), plt.title("SIFT & BRIEF scaled kps")
        plt.axis('off'), plt.imshow(cv.cvtColor(imgBrief2, cv.COLOR_BGR2RGB))
        plt.subplot(233), plt.title("STAR & BRIEF keypoints")
        plt.axis('off'), plt.imshow(cv.cvtColor(imgBriefS1, cv.COLOR_BGR2RGB))
        plt.subplot(236), plt.title("STAR & BRIEF scaled kps")
        plt.axis('off'), plt.imshow(cv.cvtColor(imgBriefS2, cv.COLOR_BGR2RGB))
        plt.tight_layout()
        plt.show()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    在这里插入图片描述



    参考文献:Michael Calonder, Vincent Lepetit, Christoph Strecha, et al. “BRIEF: Binary Robust Independent Elementary Features” In Computer Vision–ECCV 2010, pages 778–792. Springer, 2010.

    在这里插入图片描述

    【本节完】

    版权声明:
    youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/127352928)
    Copyright 2022 youcans, XUPT
    Crated:2022-10-16

    240. OpenCV 中的 Shi-Tomas 角点检测
    241. 尺度不变特征变换(SIFT)
    242. 加速稳健特征检测算法(SURF)
    243. 特征检测之 FAST 算法
    244. 特征检测之 BRIEF 特征描述

  • 相关阅读:
    微分方程和线性代数(分离变量法开始)
    Andoroid 11 开机广播处理超时导致第三方应用启动延迟
    linux系统安装 -----Centos 8 64位
    paddlespeech 语音识别 web流服务部署(Streaming Speech Recognition)
    数据可视化:地图
    【mmWave】二、IWR6843ISK-ODS毫米波雷达【固件开发】流程
    DITA-OT发布过程和中文支持
    统计官方模型的参数量和计算量
    oracle 19c 创建新用户 解决ORA-65096问题
    【运维语音播报】Zabbix告警语音声光播报的实现
  • 原文地址:https://blog.csdn.net/youcans/article/details/127352928