OpenCV 3 中的 FLANN 错误
FLANN error in OpenCV 3
我 运行宁 Ubuntu 14.04。我正在尝试使用 openCV 3 运行 FLANN,但出现错误。
下面的所有内容都是使用 AKAZE 和 ORB 尝试的,但代码来自我尝试使用 ORB。
我使用 ORB 来查找描述符和关键点。
Ptr<ORB> detector = ORB::create();
std::vector<KeyPoint> keypoints_1, keypoints_2;
Mat descriptors_1, descriptors_2;
detector->detectAndCompute( img_1, noArray(), keypoints_1, descriptors_1 );
detector->detectAndCompute( img_2, noArray(), keypoints_2, descriptors_2 );
我使用 ORB 后,使用以下代码查找匹配项:
FlannBasedMatcher matcher;
std::vector<DMatch> matches;
matcher.match(descriptors_1, descriptors_2, matches);
代码构建一切正常。当我 运行 代码时,我得到这个错误:
OpenCV Error: Unsupported format or combination of formats (type=0
) in buildIndex_, file /home/jim/opencv/modules/flann/src/miniflann.cpp, line 315
terminate called after throwing an instance of 'cv::Exception'
what(): /home/jim/opencv/modules/flann/src/miniflann.cpp:315: error: (-210) type=0
in function buildIndex_
Aborted (core dumped)
谁能告诉我为什么? OpenCV 3 是否处于 BETA 状态?是否有 FLANN 的替代品(BFMatcher 除外)
所以我说的是:
为了使用 FlannBasedMatcher
,您需要将描述符转换为 CV_32F
:
if(descriptors_1.type()!=CV_32F) {
descriptors_1.convertTo(descriptors_1, CV_32F);
}
if(descriptors_2.type()!=CV_32F) {
descriptors_2.convertTo(descriptors_2, CV_32F);
}
你可以看看this similar question:
如果无法计算描述符,也会抛出 Unsupported format or combination of formats
。
您可以在 detectAndCompute
之后使用 empty()
检查是否是这种情况,因此:
detector->detectAndCompute( img_1, noArray(), keypoints_1, descriptors_1 );
detector->detectAndCompute( img_2, noArray(), keypoints_2, descriptors_2 );
if ( descriptors_1.empty() ) {
cvError(0,"MatchFinder","descriptors_1 descriptor empty",__FILE__,__LINE__);
}
if ( descriptors_2.empty() ) {
cvError(0,"MatchFinder","descriptors_2 empty",__FILE__,__LINE__);
}
Rafael Ruiz Muñoz 的回答是错误的。
将描述符转换为 CV_32F 消除了断言错误。但是,匹配器会以错误的方式运行。
ORB 是汉明描述符。默认情况下,FlannBasedMatcher 创建 L2 euclid KDTreeIndexParams()。
尝试以流动的方式初始化匹配器,
cv::FlannBasedMatcher matcher(new cv::flann::LshIndexParams(20, 10, 2));
我 运行宁 Ubuntu 14.04。我正在尝试使用 openCV 3 运行 FLANN,但出现错误。
下面的所有内容都是使用 AKAZE 和 ORB 尝试的,但代码来自我尝试使用 ORB。
我使用 ORB 来查找描述符和关键点。
Ptr<ORB> detector = ORB::create();
std::vector<KeyPoint> keypoints_1, keypoints_2;
Mat descriptors_1, descriptors_2;
detector->detectAndCompute( img_1, noArray(), keypoints_1, descriptors_1 );
detector->detectAndCompute( img_2, noArray(), keypoints_2, descriptors_2 );
我使用 ORB 后,使用以下代码查找匹配项:
FlannBasedMatcher matcher;
std::vector<DMatch> matches;
matcher.match(descriptors_1, descriptors_2, matches);
代码构建一切正常。当我 运行 代码时,我得到这个错误:
OpenCV Error: Unsupported format or combination of formats (type=0
) in buildIndex_, file /home/jim/opencv/modules/flann/src/miniflann.cpp, line 315
terminate called after throwing an instance of 'cv::Exception'
what(): /home/jim/opencv/modules/flann/src/miniflann.cpp:315: error: (-210) type=0
in function buildIndex_
Aborted (core dumped)
谁能告诉我为什么? OpenCV 3 是否处于 BETA 状态?是否有 FLANN 的替代品(BFMatcher 除外)
所以我说的是:
为了使用 FlannBasedMatcher
,您需要将描述符转换为 CV_32F
:
if(descriptors_1.type()!=CV_32F) {
descriptors_1.convertTo(descriptors_1, CV_32F);
}
if(descriptors_2.type()!=CV_32F) {
descriptors_2.convertTo(descriptors_2, CV_32F);
}
你可以看看this similar question:
Unsupported format or combination of formats
。
您可以在 detectAndCompute
之后使用 empty()
检查是否是这种情况,因此:
detector->detectAndCompute( img_1, noArray(), keypoints_1, descriptors_1 );
detector->detectAndCompute( img_2, noArray(), keypoints_2, descriptors_2 );
if ( descriptors_1.empty() ) {
cvError(0,"MatchFinder","descriptors_1 descriptor empty",__FILE__,__LINE__);
}
if ( descriptors_2.empty() ) {
cvError(0,"MatchFinder","descriptors_2 empty",__FILE__,__LINE__);
}
Rafael Ruiz Muñoz 的回答是错误的。
将描述符转换为 CV_32F 消除了断言错误。但是,匹配器会以错误的方式运行。
ORB 是汉明描述符。默认情况下,FlannBasedMatcher 创建 L2 euclid KDTreeIndexParams()。
尝试以流动的方式初始化匹配器,
cv::FlannBasedMatcher matcher(new cv::flann::LshIndexParams(20, 10, 2));