c++ - 为什么我似乎无法使用带有 C++ 的 OpenCV 获得与 knnMatch 的任何匹配?

标签 c++ image object opencv detection

首先我要说的是,到目前为止,我已经使用 this very interesting post 建立了其中的很大一部分。关于这个问题。

在提到的帖子中,该示例使用网络摄像头和 UI 窗口来实时查看输出。我只是想使用相似的代码来比较两张图片(与一张图片和许多帧相对),但遇到了一些问题。

所以我有两个图像(cv::Mat 对象)

Mat object_1 = imread( "image1.jpg", CV_LOAD_IMAGE_GRAYSCALE );
Mat object_2 = imread( "image2.jpg", CV_LOAD_IMAGE_GRAYSCALE );

下面的代码不是很好,但这是总体思路:

int minHessian = 500;

SurfFeatureDetector detector( minHessian );
std::vector<KeyPoint> kp_object;

SurfDescriptorExtractor extractor;
Mat des_object;

extractor.compute( object_1, kp_object, des_object );

FlannBasedMatcher matcher;

std::vector<Point2f> obj_corners(4);

//Get the corners from the object
obj_corners[0] = cvPoint(0,0);
obj_corners[1] = cvPoint( object_1.cols, 0 );
obj_corners[2] = cvPoint( object_1.cols, object_1.rows );
obj_corners[3] = cvPoint( 0, object_1.rows );

Mat des_image, img_matches;
std::vector<KeyPoint> kp_image;
std::vector<vector<DMatch > > matches;
std::vector<DMatch > good_matches;
std::vector<Point2f> obj;
std::vector<Point2f> scene;
std::vector<Point2f> scene_corners(4);
Mat H;

detector.detect( object_2, kp_image );
extractor.compute( object_2, kp_image, des_image );

matcher.knnMatch(des_object, des_image, matches, 2);

for(int i = 0; i < min(des_image.rows-1,(int) matches.size()); i++) //THIS LOOP IS SENSITIVE TO SEGFAULTS
{
    if((matches[i][0].distance < 0.6*(matches[i][1].distance)) && ((int) matches[i].size()<=2 && (int) matches[i].size()>0))
    {
        good_matches.push_back(matches[i][0]);
    }
}

这里的问题是因为 matches.size() 等于 0,所以它根本没有进入循环。

我的问题是,(即使两个原始图像相同)为什么没有匹配项?

最佳答案

您需要检测 object_1 中的关键点与 detector.detect(object_1, kp_image );

然后您可以调用 extractor.compute( object_1, kp_object, des_object );如所见HERE

关于c++ - 为什么我似乎无法使用带有 C++ 的 OpenCV 获得与 knnMatch 的任何匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19248452/

相关文章:

java - 有没有办法使用 POI Api 将图像添加到单元格?

Java:从类创建对象

javascript - 按字母顺序向下拉列表添加选项

javascript - 向函数内的对象添加值

c++ - 在 C++ 中包装算术类型

c++ - 将加密的 wstring 写入 wofstream

c++ - 指向模板类对象的指针

python - 如何有效地将大图像分割成多个部分并旋转它们?

jquery - 更改图标图像的CSS代码

c++ - 3维数组c++中的访问冲突(使用malloc)