19-离线词典生成原理、图像描述子用BoW转化为BoW向量和FeatureVe
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相关推荐
- 计算机视觉--局部图像描述子
第二章 局部图像描述子 (一)SIFT特征原理描述 1.SIFT综述 尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来侦测与描述 ...
- 局部图像描述子【计算机视觉第二章】
目录 什么是局部图像描述子 Harris角点检测算法 角点(corner points): 角点特征: Harris 角点检测算子: Harris 角点检测算法的基本思想: Harris 角点检测算法 ...
- 【计算机视觉】局部图像描述子:SIFT算法
文章目录 [计算机视觉]局部图像描述子:SIFT算法 1. SIFT算法的原理 1.1 SIFT算法的目标与思想 1.1.1 算法目标 1.1.2 算法思想 1.2 尺度空间的思想和表示 1.2.1 ...
- Python计算机视觉编程第二章——局部图像描述子
Python计算机视觉编程 局部图像描述子 (一)Harris 角点检测器 (二)SIFT(尺度不变特征变换) 2.1 兴趣点 2.2 描述子 2.3 检测兴趣点 2.4 匹配描述子 (三)匹配地理标 ...
- 二、【python计算机视觉编程】局部图像描述子
局部图像描述子 (一)Harris角点检测器 (二)SIFT(尺度不变特征变换) (1)兴趣点 (2)描述子 (3)检测兴趣点 (4)匹配描述子 (三)匹配地理标记图像 (1)从Panoramio下载 ...
- 【昇腾学院】昇腾AI处理器软件栈--框架管理器(Framework)离线模型生成
离线模型生成 以卷积神经网络为例,在深度学习框架下构造好相应的网络模型,并且训练好原始数据,再通过离线模型生成器进行算子调度优化.权重数据重排和压缩.内存优化等,最终生成调优好的离线模型.离线模型生成 ...
- ehd边缘直方图描述子 matlab,第 2 章 局部图像描述子
第 2 章 局部图像描述子 本章旨在寻找图像间的对应点和对应区域.本章将介绍用于图像匹配的两种局部描述子算法.本书的很多内容中都会用到这些局部特征,它们在很多应用中都有重要作用,比如创建全景图.增强现 ...
- QR码生成原理-QR Code(ISO 18004)编码方式
QR码生成原理-QR Code(ISO 18004)编码方式 一.什么是QR码 QR码属于矩阵式二维码中的一个种类,由DENSO(日本电装)公司开发,由JIS和ISO将其标准化.QR码的样子其实在很多 ...
- 3GPP机密性和完整性算法规范128-EEA3和128-EIA3(一)----密钥生成原理
3GPP机密性和完整性算法规范128-EEA3和128-EIA3(一)----密钥生成原理 3GPP机密性和完整性算法规范128-EEA3和128-EIA3(二)----祖冲之算法的C语言实现 3GP ...
- 二维码(QR Code)的生成原理及解析
转载自:琦小虾 https://blog.csdn.net/ajianyingxiaoqinghan/article/details/78837864#comments 二维码生成原理及解析代码 自从 ...
最新文章
- 论文: Data-Driven Evolutionary Optimization: An Overview and case studies(1) 数据驱动概念,文章结构,大数分类
- JavaScript 专题之如何判断两个对象相等
- Oracle创建用户,创建表空间,将空间分配给用户,给用户授权
- 中科院大学计算机研究生考试大纲,中国科学院大学《计算机原理》2019年硕士研究生入学考试大纲...
- python julia go_挑战Python的四个语言:Swift、Go、Julia、R
- 数据镜像备份工具rsync + inotify
- php 导出excel类,php 导出excel类
- 深度学习数据集制作_深度学习时代的数据驱动建模之探讨
- uboot驱动模型(DM)分析(一)
- 由深圳的大树所想到的
- es统计有多少个分组_ElasticSearch 分组查询的几个例子
- 嵌入式linux基础学习全套精品视频教程
- 服务器装系统报0x0000005d,虚拟机不能安装Win10系统,提示your PC needs to restart,错误代码0x0000005D该怎么办-电脑自学网...
- 【APP】模拟器的学习和使用
- [题]走廊泼水节——#最小生成树kru
- FastText文本分类以及生成词向量
- Plotting timeseries
- 手机投屏到电脑的实用工具
- 大量的数据mysql查询最新的记录慢问题
- XML Schema学习札记(1)——基础总览
热门文章
- windows系统 cmd 下载python包的代理配置
- PPT,我的视频制作利器
- 云端: 小软件大平台,绿色又安全 V0.9 Beta3(090722)
- 数学建模之综合评价模型(层次分析法+Topsis法+熵权法)
- StretchDIBits速度测试(COLORONCOLOR)
- xp我的计算机不在桌面怎么办,xp系统开机后不显示桌面怎么办|xp电脑开机不显示桌面解决方法...
- Target folder is neither empty nor does it point to an existing SDK installtion.
- 安装dbVisualizer报错:the java_home environment viariable does not point to a working 32-bit JDK OR JRE
- traceroute和tracert原理
- duilib 添加自定义list一例