栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

ORBSLAM2 Win10 VS2017 二进制词袋修改

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ORBSLAM2 Win10 VS2017 二进制词袋修改

步骤
  • 前言
  • 词袋下载
  • TemplatedVocabulary.h 文件修改
  • System.cc 文件修改

前言

  资料汇总,步骤记录,仅供参考。

词袋下载

  前往 https://github.com/nxyzgf/sgg-dbow2 下载ORBvoc.bin

TemplatedVocabulary.h 文件修改

  首先在第240行左右,loadFromTextFile函数的声明下增加如下声明:

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

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

&esmp; 然后基于上述修改过后的第1430行左右,添加loadFromBinaryFile函数的定义:

template
bool TemplatedVocabulary::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;
}

// --------------------------------------------------------------------------
System.cc 文件修改

  在第65行左右,将对应的调用修改如下:

    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);
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/605303.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号