您的位置:首页 > 其它

flann中关于indexParam的使用说明

2016-11-01 19:21 417 查看
今天研究了一下opencv中的FLANN库,踩坑一下午,遇到问题:OpenCV Error: Unsupported format or combination of formats (type=5)

在stackoverflow下也没人解决,所以特意记录下。

在库中使用Index类,完成knn的查找。其构造函数为:

 Index(InputArray features, const IndexParams& params, cvflann::flann_distance_t distType=cvflann::FLANN_DIST_L2);

其参数有一些特殊要求:

1.对于params的取值为 AutotunedIndexParams、LinearIndexParams、KDTreeIndexParams时需要使用float型的features

2.当param为LshIndexParams时,features是uchar的Mat

原因是Index的构造函数其实调用了其build方法:

void Index::build(InputArray _data, const IndexParams& params, flann_distance_t _distType)

{

    release();

    algo = getParam<flann_algorithm_t>(params, "algorithm", FLANN_INDEX_LINEAR);

    if( algo == FLANN_INDEX_SAVED )

    {

        load(_data, getParam<String>(params, "filename", String()));

        return;

    }

    Mat data = _data.getMat();

    index = 0;

    featureType = data.type();

    distType = _distType;

    if ( algo == FLANN_INDEX_LSH)

    {

        distType = FLANN_DIST_HAMMING;

    }

    switch( distType )

    {

    case FLANN_DIST_HAMMING:

        buildIndex< HammingDistance >(index, data, params);

        break;

    case FLANN_DIST_L2:

        buildIndex< ::cvflann::L2<float> >(index, data, params);

        break;

    case FLANN_DIST_L1:

        buildIndex< ::cvflann::L1<float> >(index, data, params);

        break;

#if MINIFLANN_SUPPORT_EXOTIC_DISTANCE_TYPES

    case FLANN_DIST_MAX:

        buildIndex< ::cvflann::MaxDistance<float> >(index, data, params);

        break;

    case FLANN_DIST_HIST_INTERSECT:

        buildIndex< ::cvflann::HistIntersectionDistance<float> >(index, data, params);

        break;

    case FLANN_DIST_HELLINGER:

        buildIndex< ::cvflann::HellingerDistance<float> >(index, data, params);

        break;

    case FLANN_DIST_CHI_SQUARE:

        buildIndex< ::cvflann::ChiSquareDistance<float> >(index, data, params);

        break;

    case FLANN_DIST_KL:

        buildIndex< ::cvflann::KL_Divergence<float> >(index, data, params);

        break;

#endif

    default:

        CV_Error(Error::StsBadArg, "Unknown/unsupported distance type");

    }

}

从中可以看出,除FLANN_DIST_HAMMING外,其余数据类型都为float型

对于FLANN_DIST_HAMMING其中:

  if ( algo == FLANN_INDEX_LSH)

    {

        distType = FLANN_DIST_HAMMING;

    }

 switch( distType )

    {

    case FLANN_DIST_HAMMING:

        buildIndex< HammingDistance >(index, data, params);

        break;

HammingDistance的定义为:typedef ::cvflann::Hamming<uchar> HammingDistance;

因此,使用LshIndexParams时,features的类型要为uchar。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: