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。
在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。
相关文章推荐
- 关于Adodb.Stream 的使用说明
- 关于在组件GIS开发中使用Python的一点补充说明
- 关于使用PRO*C编程的一些简单说明和例子
- 关于REUSE_ALV_GRID_DISPLAY函数的slis_layout_alv的字段使用的说明
- FreeTextBox 1.6.3 中文版使用说明(后加关于图片设置的补充)
- 关于REUSE_ALV_GRID_DISPLAY函数的slis_layout_alv的字段使用的说明
- jQuery 中关于CSS操作部分使用说明
- 关于c#中DateTime::ParseExact的使用说明
- 关于REUSE_ALV_GRID_DISPLAY函数的slis_layout_alv的字段使用的说明
- 当dll使用静态RTL时关于内存管理的重要说明--BCB中
- 关于JScript 使用说明
- 关于Adodb.Stream 的使用说明
- 关于Adodb.Stream 的使用说明
- 关于REUSE_ALV_GRID_DISPLAY函数的slis_layout_alv的字段使用的说明
- 关于Adodb.Stream的使用说明
- 关于Adodb.Stream的使用说明
- 关于WEB使用media player的一些说明
- 关于超链接的下划线 使用说明
- 关于Adodb.Stream 的使用说明 &注册ADODB.Stream组件
- 关于Adodb.Stream 的使用说明