我尝试用最简单的代码匹配两个 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: 错误:(-215) _queryDescriptors.type() == trainDescType 在函数 cv::BFMatcher::knnMatchImpl 中 OpenCV错误:断言失败 (type == src2.type() && src1.cols == src2.cols && (type == CV_32F || type == CV_8U)),位于文件 C:\builds\master_PackSlave-win32-vc12-shared\opencv\modules\core\src\stat.cpp 的第 3608 行。 异常: C:\builds\master_PackSlave-win32-vc12-shared\opencv\modules\core\src\stat.cpp:3608: 错误:(-215) type == src2.type() && src1.cols == src2.cols && (type == CV_32F || type == CV_8U) 在函数 cv::batchDistance 中。
谢谢。
CV_32F
或CV_8U
类型,(2)它们都是相同的类型,(3)每个图像的两列是否相同。 - rayryengmatcher.match(descriptors, descriptors, matches);
也失败了... @gfkri 尝试了Flann
和Brute
两种方式... - Itay