OpenCV-Python(35):BRIEF算法

算法介绍

        BRIEF(Binary Robust Independent Elementary Features)是一种用于计算机视觉中特征点描述子的算法。它是一种二进制描述子,通过比较图像上不同位置的像素值来生成特征点的描述子。

        BRIEF算法的基本思想是选取一组固定的像素对,并比较这些像素对之间的亮度差异。对于每一个像素对,如果第一个像素的亮度大于第二个像素的亮度,则将该像素对的比较结果设为1,否则设为0。将所有像素对的比较结果串联起来,就得到了该特征点的二进制描述子。

        BRIEF算法的优点是计算速度快、内存消耗小,适用于实时应用和资源受限的设备。然而,由于BRIEF算法只比较像素的亮度差异,而没有考虑像素的空间关系,因此对于图像的旋转、尺度变化等变换不具有鲁棒性

        实际应用中,为了提高BRIEF算法的鲁棒性,通常会结合其他方法来使用,比如使用FAST算法或Harris角点检测等方法来检测特征点,然后再使用BRIEF算法生成特征点的描述子。

背景说明

        我们知道,SIFT 算法使用的是128 维的描述符。由于它是使用的浮点数,所以需要使用512 个字节。同样SURF 算法最少使用256 个字节,因为至少是64 为维描述符。创建一个包含上千个特征的向量需要消耗大量的内存,在嵌入式等资源有限的设备上这样是不合适的,因为匹配时也会消耗更多的内存和时间。

        实际的匹配过程中,如此多的维度是没有必要的。我们可以使用PCA,LDA 等方法来进行降维。甚至可以使用LSH(局部敏感哈希)将SIFT 浮点数的描述符转换成二进制字符串。对这些字符串再使用汉明距离进行匹配。汉明距离的计算只需要 XOR 位运算以及位计数,这种计算算很适合在现代的CPU 上运行。但我们还是需要先找到描述符才能使用哈希,这不能解决最初的内存消耗问题。

        BRIEF 算法应运而生。它不去计算描述符而是直接找到一个二进制字符串。这种算法使用的是已经平滑后的图像,它会按照一种特定的方式选取一组像素点对nd (x,y),然后在这些像素点对之间进行灰度值对比。例如,第一个点对的灰度值分别为p 和q。如果p 小于q,结果就是1,否则就是0。就这样对nd个点对进行对比得到一个nd 维的二进制字符串。

        nd 可以是128,256,512。OpenCV 对这些都提供了支持,但在默认情况下是256(OpenC 是使用字节表示它们的,所以􄦈这些值分别对应与16、32、64)。当我们获得这些二进制字符串之后就可以使用汉明距离对它们匹配了。

        非常重要的一点是:BRIEF 是一种特征描述符,它不提供查找特征的方法。所以我们不得不使用其他特征检测器,比如SIFT 和SURF 等。原始文献推荐使用CenSurE 特征检测器,这种算法很快。而且BRIEF 算法对CenSurE关键点的描述效果比SURF 关键点的描述更好。

        简单来说, BRIEF 是一种对特征点描述符计算和匹配的快速方法。这种算法可以实现很高的识别率,除非出现平面内的大旋转。

OpenCV 中的BRIEF

        下面的代码使用了CenSurE 特征检测器和BRIEF 描述符。在OpenCV中CenSurE 检测器被叫做STAR 检测器。

import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('simple.jpg',0)# Initiate STAR detector
star = cv2.FeatureDetector_create("STAR")# Initiate BRIEF extractor
brief = cv2.DescriptorExtractor_create("BRIEF")# find the keypoints with STAR
kp = star.detect(img,None)# compute the descriptors with BRIEF
kp, des = brief.compute(img, kp)print (brief.getInt('bytes'))
print (des.shape)

        函数brief.getInt(′bytes′) 会以字节格式给出nd 的大小,默认值为32。 

如果opencv版本不同,可能会报错,可以尝试以下代码:

在Python的OpenCV中,可以使用cv2.xfeatures2d.BriefDescriptorExtractor_create()函数来创建BRIEF算法的特征点描述子生成器。

以下是一个简单的示例代码,展示了如何在Python的OpenCV中使用BRIEF算法生成特征点的描述子:

import cv2# 读取图像
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 创建BRIEF算法的特征点检测器和描述子生成器
detector = cv2.FastFeatureDetector_create()
descriptor = cv2.xfeatures2d.BriefDescriptorExtractor_create()# 检测图像中的特征点
keypoints = detector.detect(image, None)# 计算特征点的描述子
_, descriptors = descriptor.compute(image, keypoints)# 打印特征点数目和描述子的维度
print('Number of keypoints:', len(keypoints))
print('Descriptor size:', descriptors.shape[1])

在这个示例中,首先使用cv2.imread()函数读取了一幅灰度图像。然后,使用cv2.FastFeatureDetector_create()函数创建了一个FAST算法的特征点检测器,并使用cv2.xfeatures2d.BriefDescriptorExtractor_create()函数创建了一个BRIEF算法的特征点描述子生成器。接下来,使用特征点检测器检测图像中的特征点,并使用描述子生成器计算特征点的描述子。最后,使用len()函数获取特征点的数目,使用shape[1]获取描述子的维度,并打印出来。

需要注意的是,需要安装OpenCV的Python模块和对应的xfeatures2d模块。可以使用以下命令来安装:

pip install opencv-python
pip install opencv-contrib-python

以上代码仅仅是一个简单的示例,实际应用中可能需要根据具体情况进行参数调整和错误处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/615991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12GoF之代理模式

解决问题的思维:AOP 解决问题技术:代理技术 代理技术太麻烦,因此使用框架 Spring AOP框架(底层是代理技术:jdk动态daili,cglib) 代理模式是GoF23种设计模式之一。属于结构型设计模式。 代理…

做一个个人博客第一步该怎么做?

做一个个人博客第一步该怎么做? 好多零基础的同学们不知道怎么迈出第一步。 那么,就找一个现成的模板学一学呗,毕竟我们是高贵的Ctrl c v 工程师。 但是这样也有个问题,那就是,那些模板都,太!…

C 语言每日一题——旋转数组的最小数字

一、题目内容 提供一下该OJ题的链接:旋转数组的最小数字_牛客题霸_牛客网 (nowcoder.com) 二、题目分析 通过示例1可知,我们写代码的目的是在数组中找到一个最大值,并且返回来; 我们很容易的会想到创建一个变量:int…

【Linux】 nohup命令使用

nohup命令 nohup是Linux和Unix系统中的一个命令,其作用是在终端退出时,让进程在后台继续运行。它的全称为“no hang up”,意为“不挂起”。nohup命令可以让你在退出终端或关闭SSH连接后继续运行命令。 nohup 命令,在默认情况下&…

pyx文件编译为pyd/so文件(分别在windows/linux系统下)

Python有以下几种类型的文件: py:Python控制台程序的源代码文件pyx:是Python语言的一个编译扩展,它实际上是Cython语言的源代码文件(可以理解为既支持Python语言也支持C/C)。pyc:Python字节码文…

DevOps搭建(十六)-Jenkins+K8s部署详细步骤

​ 1、整体部署架构图 2、编写脚本 vi pipeline.yml apiVersion: apps/v1 kind: Deployment metadata:namespace: testname: pipelinelabels:app: pipeline spec:replicas: 2selector:matchLabels:app: pipelinetemplate:metadata:labels:app: pipelinespec:containers:- nam…

深入了解鸿鹄电子招投标系统:Java版企业电子招标采购系统的核心功能

随着市场竞争的加剧和企业规模的扩大,招采管理逐渐成为企业核心竞争力的重要组成部分。为了提高招采工作的效率和质量,我们提出了一种基于电子化平台的解决方案。该方案旨在通过电子化招投标,使得招标采购的质量更高、速度更快,同…

基于JAVA的数据可视化的智慧河南大屏 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 数据模块 A4.2 数据模块 B4.3 数据模块 C4.4 数据模块 D4.5 数据模块 E 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的数据可视化的智慧河南大屏,包含了GDP、…

iOS 调试工具CocoaDebug

1、使用pod工具在项目里面添加CocoaDebug的SDK。 platform :ios, 11.0target ShopService doproject ShopServiceuse_frameworks!pod CocoaDebug, :configurations > [Debug]end2、之后就可以在项目里面看到效果了 APP上显示的是一个黑色背景的小圆圈。 上面39表示调用了39…

使用 vue-json-viewer 工具在界面显示json格式数据

安装vue-json-viewer npm install vue-json-viewer --save 引入&#xff1a; import JsonViewer from vue-json-viewer Vue.use(JsonViewer) 使用&#xff1a; <json-viewer :value"jsonData" show-double-quotes :preview-mode"true" :show-array…

three.js 使用 tweenjs绘制相机运动动画

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right"…

数据交付变革:研发到产运自助化的转型之路

作者 | Chris 导读 本文讲述为了提升产运侧数据观察、分析、决策的效率&#xff0c;支持业务的快速迭代&#xff0c;移动生态数据研发部对数仓建模与BI工具完成升级&#xff0c;采用宽表建模与TDA平台相结合的方案&#xff0c;一站式自助解决数据应用需求。在此过程中&#xff…

黑帽SEO简介

什么是黑帽 SEO&#xff1f; 黑帽SEO是一种违反搜索引擎指南的做法&#xff0c;用于使网站在搜索结果中排名更高。这些不道德的策略并不能解决搜索者的问题&#xff0c;并且通常以搜索引擎的惩罚而告终。黑帽技术包括关键字填充、伪装和使用专用链接网络。 出现在搜索结果中对…

vue2-手写轮播图

轮播图5长展示&#xff0c;点击指示器向右移动一个图片&#xff0c;每隔2秒移动一张照片&#xff01; <template><div class"top-app"><div class"carousel-container"><div class"carousel" ref"carousel">&…

Graphpad Prism10.1.2(324) 安装教程 (含Win/Mac版)

GraphPad Prism GraphPad Prism是一款非常专业强大的科研医学生物数据处理绘图软件&#xff0c;它可以将科学图形、综合曲线拟合&#xff08;非线性回归&#xff09;、可理解的统计数据、数据组织结合在一起&#xff0c;除了最基本的数据统计分析外&#xff0c;还能自动生成统…

最新AI绘画Midjourney绘画提示词Prompt大全

一、Midjourney绘画工具 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭…

【sklearn练习】模型评估

一、交叉验证 cross_val_score 的使用 1、不用交叉验证的情况&#xff1a; from __future__ import print_function from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifieriris…

ubuntu系统(9):ubuntu 20.02安装pydot

目录 警告信息 1、确保安装了Python和pip 2、安装Graphviz软件包 3、pip安装pydot 验证 在gem5中&#xff0c;pydot库用于生成图形化输出&#xff0c;特别是生成.dot文件和相关的图像文件&#xff0c;如PDF、PNG等。它与gem5结合使用的一个常见用途是生成系统结构图、内存…

基础篇_面向对象(什么是对象,对象演化,继承,多态,封装,接口,Service,核心类库,异常处理)

文章目录 一. 什么是对象1. 抽取属性2. 字段默认值3. this4. 无参构造5. 抽取行为 二. 对象演化1. 对象字段演化2. 对象方法演化3. 贷款计算器 - 对象改造4. 静态变量5. 四种变量 三. 继承1. 继承语法2. 贷款计算器 - 继承改造3. java 类型系统4. 类型转换1) 基本类型转换2) 包…

【算法分析与设计】最大子数组和

题目 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&a…