我试图用我能想到的最简单的代码匹配两个 SIFT
描述符,但是 OpenCV 3
不断抛出异常。
这是我的代码:
cv::Mat img1 = imread(...); // Shortened for the example
cv::Mat img2 = imread(...); // Shortened for the example
std::vector<KeyPoint> keypoints1, keypoints2;
Ptr<SIFT> ptrSift = SIFT::create(200, 3, 0.07, 15);
Mat descriptors1, descriptors2;
ptrSift->detectAndCompute(img1, Mat(), keypoints1, descriptors1, false);
ptrSift->detectAndCompute(img2, Mat(), keypoints2, descriptors2, false);
上面的代码给我带来了很好的结果,我可以使用 drawKeypoints
函数将其可视化。
然后我使用下面的代码来匹配描述符:
BFMatcher matcher;
std::vector< DMatch > matches;
matcher.match(descriptors1, descriptors2, matches);
但它一直在抛出:
C:\builds\master_PackSlave-win32-vc12-shared\opencv\modules\features2d\src\matchers.cpp:722: error: (-215) _queryDescriptors.type() == trainDescType in function cv::BFMatcher::knnMatchImpl
OpenCV Error: Assertion failed (type == src2.type() && src1.cols == src2.cols && (type == CV_32F || type == CV_8U)) in cv::batchDistance, file C:\buil ds\master_PackSlave-win32-vc12-shared\opencv\modules\core\src\stat.cpp, line 3608 Exception: C:\builds\master_PackSlave-win32-vc12-shared\opencv\modules\core\src\stat.cpp:3608: error: (-215) type == src2.type() && src1.cols == src2. cols && (type == CV_32F || type == CV_8U) in function cv::batchDistance
谢谢
最佳答案
非常有趣,下面的代码片段很适合我:
cv::BFMatcher matcher;
std::vector<cv::DMatch> matches;
cv::Mat descriptors1 = cv::Mat::eye(10, 10, CV_32F);
cv::Mat descriptors2 = cv::Mat::eye(10, 10, CV_32F);
matcher.match(descriptors1, descriptors2, matches);
你能检查一下吗?你能提供描述符的大小和类型吗?最后,您是否在发布/ Debug模式下都尝试过?
p.s.: 你用的是哪个版本?您应该尝试用最新版本覆盖并重新编译 matchers.cpp:https://github.com/Itseez/opencv/commits/master/modules/features2d/src/matchers.cpp
关于c++ - 无法将两个 SIFT 描述符与 OpenCV 匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27944994/