【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个点生成点对

【OpenCV 例程 300篇】244. 特征检测之 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)

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

cv.xfeatures2d.BriefDescriptorExtractor.create([, bytes=32, use_orientation=false]) &#x2192; retval
cv.xfeatures2d.BriefDescriptorExtractor_create([, bytes=32, use_orientation=false]) &#x2192; retval
brief.compute(image, keypoints[, descriptors=None]) &#x2192; keypoints, descriptors

参数说明:

  • 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 特征描述


    img = cv.imread("../images/book01.jpg", flags=1)
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    height, width = gray.shape[:2]
    print("shape of image: ", height, width)

    sift = cv.SIFT.create()
    kpSift = sift.detect(gray, None)
    print("shape of keypoints: ", len(kpSift))
    imgSift1 = cv.drawKeypoints(img, kpSift, None)
    imgSift2 = cv.drawKeypoints(img, kpSift, None, flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

    brief = cv.xfeatures2d.BriefDescriptorExtractor_create()
    kpBrief, des = brief.compute(img, kpSift)
    imgBrief1 = cv.drawKeypoints(img, kpBrief, None)
    imgBrief2 = cv.drawKeypoints(img, kpBrief, None, flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    print(des.shape)

    star = cv.xfeatures2d.StarDetector_create()
    brief2 = cv.xfeatures2d.BriefDescriptorExtractor_create()
    kpStar = star.detect(img, None)
    kpBriefStar, des = brief.compute(img, kpStar)
    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()

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

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

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

【本节完】

版权声明:
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 特征描述

Original: https://blog.csdn.net/youcans/article/details/127352928
Author: YouCans
Title: 【OpenCV 例程 300篇】244. 特征检测之 BRIEF 特征描述

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/701045/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球