ORB SLAM3 使用二进制文件 ORBvoc.bin 加载Vocabulary

使用 二进制文件 ORBvoc.bin 加载Vocabulary,将比ORBvoc.txt 速度快很多倍!

  实测1秒内完成加载:

一、下载ORBvoc.bin

百度网盘: ORBvoc.bin下载链接  提取码:dyyk

解压后,将ORBvoc.bin拷贝到Vocabulary文件夹下

二、修改代码

2.1  修改 Thirdparty/DBoW2/DBoW2/TemplatedVocabulary.h

①249 行在 “TextFile”类型 的下面 加入 loadFromBinaryFile() 函数 和   saveToBinaryFile() 函数的声明:

 /**
   * Loads the vocabulary from a binary file
   * @param filename
   */
  bool loadFromBinaryFile(const std::string &filename);

  /**
   * Saves the vocabulary into a binary file
   * @param filename
   */
  void saveToBinaryFile(const std::string &filename) const;  

如图: 

 

② 加入上面两个函数的定义:

 我们就写在 1465行左右 的saveToTextFile()函数定义的后面 :

template<class TDescriptor, class F>
bool TemplatedVocabulary<TDescriptor,F>::loadFromBinaryFile(const std::string &filename) {
  fstream f;
  f.open(filename.c_str(), ios_base::in|ios::binary);
  unsigned int nb_nodes, size_node;
  f.read((char*)&nb_nodes, sizeof(nb_nodes));
  f.read((char*)&size_node, sizeof(size_node));
  f.read((char*)&m_k, sizeof(m_k));
  f.read((char*)&m_L, sizeof(m_L));
  f.read((char*)&m_scoring, sizeof(m_scoring));
  f.read((char*)&m_weighting, sizeof(m_weighting));
  createScoringObject();

  m_words.clear();
  m_words.reserve(pow((double)m_k, (double)m_L + 1));
  m_nodes.clear();
  m_nodes.resize(nb_nodes+1);
  m_nodes[0].id = 0;
  char buf[size_node]; int nid = 1;
  while (!f.eof()) {
	f.read(buf, size_node);
	m_nodes[nid].id = nid;
	// FIXME
	const int* ptr=(int*)buf;
	m_nodes[nid].parent = *ptr;
	//m_nodes[nid].parent = *(const int*)buf;
	m_nodes[m_nodes[nid].parent].children.push_back(nid);
	m_nodes[nid].descriptor = cv::Mat(1, F::L, CV_8U);
	memcpy(m_nodes[nid].descriptor.data, buf+4, F::L);
	m_nodes[nid].weight = *(float*)(buf+4+F::L);
	if (buf[8+F::L]) { // is leaf
	  int wid = m_words.size();
	  m_words.resize(wid+1);
	  m_nodes[nid].word_id = wid;
	  m_words[wid] = &m_nodes[nid];
	}
	else
	  m_nodes[nid].children.reserve(m_k);
	nid+=1;
  }
  f.close();
  return true;
}

// --------------------------------------------------------------------------

template<class TDescriptor, class F>
void TemplatedVocabulary<TDescriptor,F>::saveToBinaryFile(const std::string &filename) const {
  fstream f;
  f.open(filename.c_str(), ios_base::out|ios::binary);
  unsigned int nb_nodes = m_nodes.size();
  float _weight;
  unsigned int size_node = sizeof(m_nodes[0].parent) + F::L*sizeof(char) + sizeof(_weight) + sizeof(bool);
  f.write((char*)&nb_nodes, sizeof(nb_nodes));
  f.write((char*)&size_node, sizeof(size_node));
  f.write((char*)&m_k, sizeof(m_k));
  f.write((char*)&m_L, sizeof(m_L));
  f.write((char*)&m_scoring, sizeof(m_scoring));
  f.write((char*)&m_weighting, sizeof(m_weighting));
  for(size_t i=1; i<nb_nodes;i++) {
	const Node& node = m_nodes[i];
	f.write((char*)&node.parent, sizeof(node.parent));
	f.write((char*)node.descriptor.data, F::L);
	_weight = node.weight; f.write((char*)&_weight, sizeof(_weight));
	bool is_leaf = node.isLeaf(); f.write((char*)&is_leaf, sizeof(is_leaf)); // i put this one at the end for alignement....
  }
  f.close();
}

// --------------------------------------------------------------------------

位置如图: 

 

2.2  修改 ORB_SLAM3/src/System.cc

修改加载词袋的类型为 :BinaryFile

mpVocabulary = new ORBVocabulary();
  //bool bVocLoad = mpVocabulary->loadFromTextFile(strVocFile);   //txt加载
  bool bVocLoad = mpVocabulary->loadFromBinaryFile(strVocFile);   //bin加载

三、运行

3.1 重新编译ORB-SLAM3

./build.sh

3.2 运行

运行时,需要把原来加载词袋命令  ./Vocabulary/ORBvoc.txt  改成  ./Vocabulary/ORBvoc.bin

如运行 EuRoc 单目时:

./Examples/Monocular/mono_euroc ./Vocabulary/ORBvoc.bin ./Examples/Monocular/EuRoC.yaml "$pathDatasetEuroc"/MH01 ./Examples/Monocular/EuRoC_TimeStamps/MH01.txt 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5G与中国的海

今年国庆假期&#xff0c;香港迎来了阔别5年的国庆维港烟花汇演 10月1日晚上9点&#xff0c;“HKT x FWD 2023 年国庆烟花汇演”在维多利亚港上空上演。在23分钟时间里&#xff0c;燃放了超过3万枚烟花。而与以往维港烟花秀不同的是&#xff0c;为了让更多民众欣赏这次表演&…

【C++面向对象】15. 模板

文章目录 【 1. 函数模板 】【 2. 类模板 】 模板是泛型编程的基础&#xff0c;泛型编程即以一种独立于任何特定类型的方式编写代码。模板是指创建泛型类或函数的蓝图或公式。库容器&#xff0c;比如迭代器和算法&#xff0c;都是泛型编程的例子&#xff0c;它们都使用了模板的…

Milvus Standalone安装

使用Docker Compose安装 Milvus standalone&#xff08;即单机版&#xff09;&#xff0c;进行一个快速milvus的体验。 前提条件&#xff1a; 1.系统可以使用centos 2.系统已经安装docker和docker-compose 3.milvus版本这里选择2.3.1 由于milvus依赖etcd和minio&#xff0c…

翻译: 人工智能代理 Agents in Artificial Intelligence

在人工智能中&#xff0c;代理是一种计算机程序或系统&#xff0c;旨在感知其环境、做出决策并采取行动以实现特定目标或一组目标。该代理自主运行&#xff0c;这意味着它不受人类操作员的直接控制。 智能体可以根据其特征分为不同类型&#xff0c;例如它们是被动的还是主动的…

CUDA学习笔记8——GPU硬件资源

简单来说就是为了充分利用GPU&#xff0c;不要让分出去的CUDA核心摸鱼闲置&#xff1b;GPU每次干活&#xff0c;都是以最小的组分配的&#xff0c;因此分派任务的时候就尽量充分发挥每个小组里CUDA核心的作用。这里的每个小组就是一个SM&#xff08;stream multi-processor&…

Python基础:正则表达式(regular expression)详解

在Python中&#xff0c;正则表达式是一种强大的工具&#xff0c;可用于匹配和操作字符串。什么是正则表达式&#xff1f; 正则表达式是一种模式匹配语言&#xff0c;用于匹配字符串中的特定模式。这些模式可以是字母、数字、字符组合或其他符号。正则表达式通常用于文本处理、网…

短视频账号矩阵系统源码/技术源码分享/技术搭建架构

短视频账号矩阵系统----技术源码分享/技术搭建架构 抖音seo又叫抖音搜索引擎&#xff0c;只要能做到布词&#xff0c;和过去的百度seo优化一样&#xff0c;布词&#xff0c;布关键词&#xff0c;当搜索栏搜索时可以搜索到该短视频。优化视频关键词&#xff0c;做好关键词的优化…

Python实现视频字幕时间轴格式转换

自己喜欢收藏电影&#xff0c;有时网上能找到的中文字幕文件都不满足自己电影版本。在自己下载的压制版电影中已内封非中文srt字幕时&#xff0c;可以选择自己将srt的时间轴转为ass并替换ass中的时间轴。自己在频繁 复制粘贴改格式的时候想起可以用Python代码完成转换这一操作&…

基于操作系统讨论Java线程与进程、浅谈Go的线程与管程

文章目录 操作系统中的进程进程概念进程的状态 Java中的进程Java进程的概念Java进程的特性Java进程的状态Java进程与操作系统进程的通信 操作系统的进程和Java进程的区别联系操作系统进程Java 进程区别和联系 操作系统中的线程动机优点多核编程 Java中的线程定义&#xff1a;特…

Ubuntu搭建openvpn服务器

文章目录 一、基于ubuntu搭建openvpn服务器二、制作相关证书2.1 制作ca证书2.2 制作Server端证书2.3 制作Client端证书 三、配置服务器3.1 配置Server端3.2. 配置Client端 四、安装openvpn客户端 一、基于ubuntu搭建openvpn服务器 确保网络连通&#xff0c;使用ifconfig查看本…

5.以docker容器生成镜像推送到私有镜像仓库

1.创建私有仓库 1.1 拉取私有仓库镜像registry docker pull registry1.2 运行私有仓库镜像registry docker run -d -p 5001:5000 -v /data/myregistry/:/tmp/registry --privilegedtrue registry1.3 校验私有仓库registry是否安装成功 curl -XGET http://localhost:5001/v2…

肖sir__linux讲解(2.1)

linux命令 cp 复制命令 a、cp 原文件名称 新文 件名称&#xff08;不存在的文件&#xff09; 案例&#xff1a;cp a k 截图&#xff1a; b.cp 原文件名称 原有文 件名称&#xff08;存在的文件&#xff09; 案例:cp a b 截图&#xff1a; c、cp 指定路径复制 格式&#xff…

第14届蓝桥杯青少组python试题解析:23年5月省赛

选择题 T1. 执行以下代码&#xff0c;输出结果是&#xff08;&#xff09;。 lst "abc" print(lstlst)abcabc abc lstlst abcabc T2. 执行以下代码&#xff0c;输出的结果是&#xff08;&#xff09;。 age {16,18,17} print(type(sorted(age)))<class set&…

在Windows系统中查找GitBash安装位置

使用注册表可以轻松获取&#xff1a; reg query HKEY_LOCAL_MACHINE\SOFTWARE\GitForWindows /v InstallPath | findStr InstallPath此时输出一串字符&#xff0c; 通过字符串切割即可获取&#xff1a;

【转载】快速搭建OpenGL环境!!!Windows10 + Visual Studio 2019 搭建OpenGL环境

目录 具体链接&#xff1a; 【转自】 完成后效果如下&#xff1a; 一开始的爆红&#xff1a; 下载安装后&#xff1a; 运行成功&#xff1a; 具体链接&#xff1a; 萌新向&#xff01;&#xff01;&#xff01;Windows10 Visual Studio 2019 搭建OpenGL环境&#xff08;…

腾讯云服务器新用户优惠政策,腾讯云新人服务器购买入口

腾讯云服务器新用户优惠政策是腾讯云为新用户提供的一种优惠&#xff0c;它可以帮助新用户以更低的价格购买腾讯云服务器&#xff0c;并且还提供一些额外的优惠。腾讯云服务器对于新用户有着非常优惠的政策。无论你是个人用户还是企业用户&#xff0c;只要你是第一次购买腾讯云…

Android NDK JNI 开发native层崩溃日志栈分析

问题&#xff1a; 在Android的JNI开发中&#xff0c;你是否看到如下一堆崩溃日志&#xff0c;不知如何下手分析问题&#xff0c;崩溃在哪一行&#xff1f; 11-16 17:20:44.844 23077 23077 W test_jni_h: jni_preload: Starting for processln 11-16 17:20:44.844 23077 2307…

NSSCTF第12页(3)

[NSSCTF 2nd]php签到 首先&#xff0c;代码定义了一个名为 waf 的函数&#xff0c;用于执行一个简单的文件扩展名检查来防止上传恶意文件。 $black_list 是一个存储不允许的文件扩展名的数组&#xff0c;如 “ph”、“htaccess” 和 “ini”。 pathinfo($filename, PATHINF…

SSM整合原理和实战

一、SSM整合理解 父工程用pom 我原来没见过&#xff0c;

吉利银河L6顶配 官方OTA升级降低充电速度

互联网是有记忆的 你宣传充电口 卖出去又更新降低速度 属于诈骗 吉利新车上市两个月官降1w,希望大家引以为戒,可以买,但是刚出别着急做韭菜