ORB SLAM3将词袋文件改成二进制ORBvoc.bin

前言

保存成二进制格式存储的优点1).加载与保存速度快2).保存成的文件小3).保存的内容不易损坏1. 下载二进制词袋   ORBvoc.bin  放在 orbsalm2   / Vocabulary 下

下载地址https://github.com/nxyzgf/sgg-dbow2 

2 DBOW2 文件夹里面  TemplatedVocabulary.h 文件修改两处内容

首先,在loadFromTextFile函数的声明下增加loadFromBinaryFile声明:

 /**
   * Loads the vocabulary from a text file
   * @param filename
   */
  在bool loadFromTextFile(const std::string &filename);下面添加:
  

  bool loadFromBinaryFile(const std::string &filename);

其次,第1427行左右,添加loadFromBinaryFile函数的定义,也就是在loadFromTextFile函数定义下面添加:

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 = new char[size_node];
	// 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;
	}
	delete buf;
	f.close();
	return true;
}

3 在System.cc文件中将对应的调用修改如下(大概在第100行):

    mpVocabulary = new ORBVocabulary();
    // bool bVocLoad = mpVocabulary->loadFromTextFile(strVocFile);
    bool bVocLoad = mpVocabulary->loadFromBinaryFile(strVocFile);
    if(!bVocLoad)
    {
        cerr << "Wrong path to vocabulary. " << endl;
        cerr << "Falied to open at: " << strVocFile << endl;
        exit(-1);
    }

4 重新进行编译即可。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值