c++ - 无法将两个 SIFT 描述符与 OpenCV 匹配

标签 c++ opencv image-processing computer-vision feature-detection

我试图用我能想到的最简单的代码匹配两个 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/

相关文章:

c++ - 这个 static_assert 会被触发吗?

c++ - 获取 cv::Mat 的值

c# - 双线性插值 - DirectX 与 GDI+

image-processing - FFMPEG:图像/视频的色度键/绿屏过滤器

c++ - ldd 输出静态链接到共享库

c++ - 你如何使用 Eigen 中的 BandMatrix 类?

c++ - CMAKE_COMPILER_IS_GNUCXX 和 CMAKE_CXX_COMPILER_ID 为空

xcode - 在Mac上安装OpenCV错误

opencv - 计算明亮像素并将它们相加。医学图像 C++

python - 使用 OpenCV 进行视频处理