ORBSLAM2


ORB-SLAM离线词典生成原理、图像描述子用BoW转化为BoW向量和FeatureVe

  • ORBSLAM2
  • 代码

代码

bool Tracking::TrackReferenceKeyFrame()
{// Compute Bag of Words vectormCurrentFrame.ComputeBoW();//如果词袋没有计算,需要计算计算词袋

ComputeBow()

void KeyFrame::ComputeBoW()
{if(mBowVec.empty() || mFeatVec.empty())//如果词袋是空的{vector<cv::Mat> vCurrentDesc = Converter::toDescriptorVector(mDescriptors);//计算输入描述子,转化词袋需要的描述子的格式// Feature vector associate features with nodes in the 4th level (from leaves up)// We assume the vocabulary tree has 6 levels, change the 4 otherwisempORBvocabulary->transform(vCurrentDesc,mBowVec,mFeatVec,4);//词袋模型库进行计算词袋,输入当前的描述子,输出磁带向量以及记录node}
}

如何实现tansform


//将一幅图像中所有特征点转化为BoWervector 与 FeatureVectortemplate<class TDescriptor, class F> //这是一个类模板
void TemplatedVocabulary<TDescriptor,F>::transform(const std::vector<TDescriptor>& features,BowVector &v, FeatureVector &fv, int levelsup) const
{v.clear();//将BoWvector与featureVector给清空fv.clear();if(empty()) // safe for subclasses{return;}// normalize LNorm norm;bool must = m_scoring_object->mustNormalize(norm);//依据评分类型,确定是否需要归一化typename vector<TDescriptor>::const_iterator fit;if(m_weighting == TF || m_weighting == TF_IDF)//{unsigned int i_feature = 0;//遍历图像中的特征点for(fit = features.begin(); fit < features.end(); ++fit, ++i_feature){WordId id;//叶子节点的word idNodeId nid;//FeatureVector中的NodeIDWordValue w; //叶子节点word对应的权重// w is the idf value if TF_IDF, 1 if TF// 将当前描述子转化为Word id, Word weight,节点所属的父节点id(这里的父节点不是叶子
//的上一层,它距离叶子深度为levelsup)transform(*fit, id, w, &nid, levelsup);//进入if(w > 0) // not stopped{ //如果权重大于0v.addWeight(id, w);//添加wordID与权重fv.addFeature(nid, i_feature);//添加深度}}if(!v.empty() && !must){// unnecessary when normalizingconst double nd = v.size();for(BowVector::iterator vit = v.begin(); vit != v.end(); vit++) vit->second /= nd;}}else // IDF || BINARY{unsigned int i_feature = 0;for(fit = features.begin(); fit < features.end(); ++fit, ++i_feature){WordId id;NodeId nid;WordValue w;// w is idf if IDF, or 1 if BINARYtransform(*fit, id, w, &nid, levelsup);if(w > 0) // not stopped{v.addIfNotExist(id, w);fv.addFeature(nid, i_feature);}}} // if m_weighting == ...if(must) v.normalize(norm);
}

词袋树

Transform()


template<class TDescriptor, class F>
void TemplatedVocabulary<TDescriptor,F>::transform(const TDescriptor &feature, WordId &word_id, WordValue &weight, NodeId *nid, int levelsup) const
{ //传参:特征描述子、word id 、word权重、记录当前描述子转化为world的所属nodeid以及它距离叶子深度的levelup、距离叶子深度// propagate the feature down the treevector<NodeId> nodes;typename vector<NodeId>::const_iterator nit;// level at which the node must be stored in nid, if givenconst int nid_level = m_L - levelsup;//用总的深度减去定义的深度if(nid_level <= 0 && nid != NULL) *nid = 0; // rootNodeId final_id = 0; // rootint current_level = 0;//第0层do{++current_level;//深度+1nodes = m_nodes[final_id].children;//列出该节点所有idfinal_id = nodes[0];//将第一个赋值给final_iddouble best_d = F::distance(feature, m_nodes[final_id].descriptor);//计算他与传入的描述子的距离for(nit = nodes.begin() + 1; nit != nodes.end(); ++nit){//开始迭代该层所有nodeNodeId id = *nit;double d = F::distance(feature, m_nodes[id].descriptor);//作比较选出最接近的nodeif(d < best_d){best_d = d;final_id = id;}}if(nid != NULL && current_level == nid_level)//判断当前层数是否和选的层数一致*nid = final_id;//是的话记录} while( !m_nodes[final_id].isLeaf() );//判断是不是叶子节点,不是的话接着循环// turn node id into word idword_id = m_nodes[final_id].word_id;//返回word的id与权重weight = m_nodes[final_id].weight;
}

19-离线词典生成原理、图像描述子用BoW转化为BoW向量和FeatureVe相关推荐

  1. 计算机视觉--局部图像描述子

    第二章 局部图像描述子 (一)SIFT特征原理描述 1.SIFT综述 尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来侦测与描述 ...

  2. 局部图像描述子【计算机视觉第二章】

    目录 什么是局部图像描述子 Harris角点检测算法 角点(corner points): 角点特征: Harris 角点检测算子: Harris 角点检测算法的基本思想: Harris 角点检测算法 ...

  3. 【计算机视觉】局部图像描述子:SIFT算法

    文章目录 [计算机视觉]局部图像描述子:SIFT算法 1. SIFT算法的原理 1.1 SIFT算法的目标与思想 1.1.1 算法目标 1.1.2 算法思想 1.2 尺度空间的思想和表示 1.2.1 ...

  4. Python计算机视觉编程第二章——局部图像描述子

    Python计算机视觉编程 局部图像描述子 (一)Harris 角点检测器 (二)SIFT(尺度不变特征变换) 2.1 兴趣点 2.2 描述子 2.3 检测兴趣点 2.4 匹配描述子 (三)匹配地理标 ...

  5. 二、【python计算机视觉编程】局部图像描述子

    局部图像描述子 (一)Harris角点检测器 (二)SIFT(尺度不变特征变换) (1)兴趣点 (2)描述子 (3)检测兴趣点 (4)匹配描述子 (三)匹配地理标记图像 (1)从Panoramio下载 ...

  6. 【昇腾学院】昇腾AI处理器软件栈--框架管理器(Framework)离线模型生成

    离线模型生成 以卷积神经网络为例,在深度学习框架下构造好相应的网络模型,并且训练好原始数据,再通过离线模型生成器进行算子调度优化.权重数据重排和压缩.内存优化等,最终生成调优好的离线模型.离线模型生成 ...

  7. ehd边缘直方图描述子 matlab,第 2 章 局部图像描述子

    第 2 章 局部图像描述子 本章旨在寻找图像间的对应点和对应区域.本章将介绍用于图像匹配的两种局部描述子算法.本书的很多内容中都会用到这些局部特征,它们在很多应用中都有重要作用,比如创建全景图.增强现 ...

  8. QR码生成原理-QR Code(ISO 18004)编码方式

    QR码生成原理-QR Code(ISO 18004)编码方式 一.什么是QR码 QR码属于矩阵式二维码中的一个种类,由DENSO(日本电装)公司开发,由JIS和ISO将其标准化.QR码的样子其实在很多 ...

  9. 3GPP机密性和完整性算法规范128-EEA3和128-EIA3(一)----密钥生成原理

    3GPP机密性和完整性算法规范128-EEA3和128-EIA3(一)----密钥生成原理 3GPP机密性和完整性算法规范128-EEA3和128-EIA3(二)----祖冲之算法的C语言实现 3GP ...

  10. 二维码(QR Code)的生成原理及解析

    转载自:琦小虾 https://blog.csdn.net/ajianyingxiaoqinghan/article/details/78837864#comments 二维码生成原理及解析代码 自从 ...

最新文章

  1. 论文: Data-Driven Evolutionary Optimization: An Overview and case studies(1) 数据驱动概念,文章结构,大数分类
  2. JavaScript 专题之如何判断两个对象相等
  3. Oracle创建用户,创建表空间,将空间分配给用户,给用户授权
  4. 中科院大学计算机研究生考试大纲,中国科学院大学《计算机原理》2019年硕士研究生入学考试大纲...
  5. python julia go_挑战Python的四个语言:Swift、Go、Julia、R
  6. 数据镜像备份工具rsync + inotify
  7. php 导出excel类,php 导出excel类
  8. 深度学习数据集制作_深度学习时代的数据驱动建模之探讨
  9. uboot驱动模型(DM)分析(一)
  10. 由深圳的大树所想到的
  11. es统计有多少个分组_ElasticSearch 分组查询的几个例子
  12. 嵌入式linux基础学习全套精品视频教程
  13. 服务器装系统报0x0000005d,虚拟机不能安装Win10系统,提示your PC needs to restart,错误代码0x0000005D该怎么办-电脑自学网...
  14. 【APP】模拟器的学习和使用
  15. [题]走廊泼水节——#最小生成树kru
  16. FastText文本分类以及生成词向量
  17. Plotting timeseries
  18. 手机投屏到电脑的实用工具
  19. 大量的数据mysql查询最新的记录慢问题
  20. XML Schema学习札记(1)——基础总览

热门文章

  1. windows系统 cmd 下载python包的代理配置
  2. PPT,我的视频制作利器
  3. 云端: 小软件大平台,绿色又安全 V0.9 Beta3(090722)
  4. 数学建模之综合评价模型(层次分析法+Topsis法+熵权法)
  5. StretchDIBits速度测试(COLORONCOLOR)
  6. xp我的计算机不在桌面怎么办,xp系统开机后不显示桌面怎么办|xp电脑开机不显示桌面解决方法...
  7. Target folder is neither empty nor does it point to an existing SDK installtion.
  8. 安装dbVisualizer报错:the java_home environment viariable does not point to a working 32-bit JDK OR JRE
  9. traceroute和tracert原理
  10. duilib 添加自定义list一例