youcans 的 OpenCV 例程 300篇244. 特征检测之 BRIEF 特征描述
Posted YouCans
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了youcans 的 OpenCV 例程 300篇244. 特征检测之 BRIEF 特征描述相关的知识,希望对你有一定的参考价值。
【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-16240. OpenCV 中的 Shi-Tomas 角点检测
241. 尺度不变特征变换(SIFT)
242. 加速稳健特征检测算法(SURF)
243. 特征检测之 FAST 算法
244. 特征检测之 BRIEF 特征描述
以上是关于youcans 的 OpenCV 例程 300篇244. 特征检测之 BRIEF 特征描述的主要内容,如果未能解决你的问题,请参考以下文章
youcans 的 OpenCV 例程 300篇244. 特征检测之 BRIEF 特征描述
youcans 的 OpenCV 例程 300篇244. 特征检测之 BRIEF 特征描述
OpenCV 例程 300篇255.OpenCV 实现图像拼接
OpenCV 例程 300篇255.OpenCV 实现图像拼接