用于ORB特征检测器的opencv中的kdtree训练

时间:2013-11-14 17:46:53

标签: android opencv feature-detection kdtree

我正在使用Opancv4android进行实时物体识别,我能够使用相机捕获的图像使用ORB检测器和描述符提取器检测,提取特征点。现在,我想构建一个Kdtree并使用这些特征点训练它们,然后我将树中的这些特征点与摄像机实时检测到的特征点进行匹配并识别对象。请帮助我如何在opencv中构建KD树或任何指针或KDtree for opencv上的参考/教程将非常有帮助。

2 个答案:

答案 0 :(得分:3)

实施方法,将在完成代码后发布代码

收集训练集

捕获您要训练的所有图像,并将它们存储在Android中的SD卡/外部目录中,并有一个xml / txt文件,其中包含您捕获的图像的所有名称。

特征提取

从相机捕获帧并将其传递给Mat对象,您可以从中提取要素以获取查询描述符集。为了从训练集中提取特征,您从存储位置读取文件,获取文件中的图像列表,并将存储的所有图像传递到Mat对象的矢量中,并提取特征点以获得训练描述符集。

描述符匹配

同样在这里,您需要传递查询描述符和训练描述符的向量,并且在获得正确匹配的结果后,您可以根据Dmatches的向量获得输出,您可以在图像之间绘制匹配或使用单应性绘制矩形在公认的对象上。

骨架代码

static void detectKeypoints( const Mat& queryImage, vector<KeyPoint>& queryKeypoints,
                  const vector<Mat>& trainImages, vector<vector<KeyPoint> >& trainKeypoints,
                  Ptr<FeatureDetector>& featureDetector )
{

featureDetector->detect( queryImage, queryKeypoints );
featureDetector->detect( trainImages, trainKeypoints );

}

static void computeDescriptors( const Mat& queryImage, vector<KeyPoint>& queryKeypoints, Mat& queryDescriptors,
                     const vector<Mat>& trainImages, vector<vector<KeyPoint> >& trainKeypoints, vector<Mat>& trainDescriptors,
                     Ptr<DescriptorExtractor>& descriptorExtractor )
{

descriptorExtractor->compute( queryImage, queryKeypoints, queryDescriptors );
descriptorExtractor->compute( trainImages, trainKeypoints, trainDescriptors );


}

static void matchDescriptors( const Mat& queryDescriptors, const vector<Mat>& trainDescriptors,
                   vector<DMatch>& matches, Ptr<DescriptorMatcher>& descriptorMatcher )
{

descriptorMatcher->add( trainDescriptors );
descriptorMatcher->train();

descriptorMatcher->match( queryDescriptors, matches );

CV_Assert( queryDescriptors.rows == (int)matches.size() || matches.empty() );


}

答案 1 :(得分:2)

FLANN matcher(也this link)基于kd-tree,它在matcher中自动构建。

但是我建议你使用带有汉明距离的BFMatcher - 在你的情况下它被设计为二进制描述符作为ORB。 Here is an example它如何用于FREAK(二进制描述符)。