- 前言
- 词袋下载
- 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函数的定义:
templateSystem.cc 文件修改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; } // --------------------------------------------------------------------------
在第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);
}



