【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个点生成点对 <x, y>,比较像素值大小,得到一个二进制数 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)

在 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

参数说明:

  • 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()


在这里插入图片描述



参考文献: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 特征描述

猜你喜欢

转载自blog.csdn.net/youcans/article/details/127352928