训练具体在哪个阶段在OpenCV的FlannBasedMatcher进行
At what stage the training exactly takes place in FlannBasedMatcher in OpenCV?
下面的代码是用C++编写的,我正在使用OpenCV进行实验。假设我以以下方式使用kd-tree(FlannBasedMatcher):
//these are inputs to the code snippet below.
//They are filled with suitable values
Mat& queryDescriptors;
vector<Training> &trainCollection;
vector< vector<DMatch> >& matches;
int knn;
//setting flann parameters
const Ptr<flann::IndexParams>& indexParams=new flann::KDTreeIndexParams(4);
const Ptr<flann::SearchParams>& searchParams=new flann::SearchParams(64);
FlannBasedMatcher matcher(indexParams, searchParams);
for (int i = 0; i < trainCollection.size();i++){
Training train = trainCollection.at(i);
Mat trainDescriptors(train.trainDescriptors);
trainDescriptorCollection.push_back(trainDescriptors);
}
matcher.add(trainDescriptorCollection);
matcher.train();
//Now, we may do knnMatch (or anyother matching)
matcher.knnMatch(queryDescriptors,matches,knn);
在上面的代码中,似乎在调用train()函数时进行了训练(即构建了kd树)。但如果我们看看train()函数内部,就会发现问题:
void FlannBasedMatcher::train()
{
if( flannIndex.empty() || mergedDescriptors.size() < addedDescCount )
{
mergedDescriptors.set( trainDescCollection );
flannIndex = new flann::Index( mergedDescriptors.getDescriptors(), *indexParams );
}
}
这两个操作(设置训练描述符和flann索引,我在调用train()之前已经做过了)。那么kd树究竟是什么时候建立的呢?
当代码调用FlannBasedMatcher::train()时,FlannBasetMatcher的索引将由构建
flannIndex = new flann::Index( mergedDescriptors.getDescriptors(), *indexParams );
代码
if( flannIndex.empty() || mergedDescriptors.size() < addedDescCount )
是为了检查FlannBasedMatcher的索引以前是否已经构建过。如果之前已经建立了索引,train()函数将跳过建立索引的过程以节省时间。
根据文档,每次匹配之前都要进行训练(即在构建kd树的cae中)。cv::DescriptorMatcher
类在需要时自动调用训练方法。
相关文章:
- G++ 在尝试使用 G++ 使用 openCV 进行编译后返回错误
- 使用 OpenCV 3 进行自动校准?
- Caffe Net.Forward 尝试使用 OpenCV 进行人脸检测时出错
- 使用OpenCV进行人脸检测
- RGB颜色图像直方图使用OpenCV C 进行对比度拉伸
- 哪个分类器可用于使用C 和OPENCV进行铁路线检测
- 使用计算机视觉进行产品检测-使用opencv进行边缘检测
- 使用OpenCV进行球检测
- 使用OpenCV进行视频稳定
- 在Ubuntu中使用OpenCV进行编译警告
- 使用OpenCV进行图像捕获-选择超时错误
- 使用 opencv 进行运动检测时出错
- 使用OpenCV进行激光线检测
- 使用 opencv 进行实时摄像机模板匹配
- 包装使用OpenCV进行图像处理的C代码,以便与同样使用OpenCV的Python一起使用
- 使用C++和OpenCV进行图像比较的方法
- 将检测到的人脸与现有人脸阵列与 android 中的 opencv 进行比较
- 使用OpenCV进行红外图像分割
- 在给定图像中使用opencv进行对象识别
- 使用OpenCV进行对象检测和隔离