为什么我似乎无法使用 OpenCV 与 C++ 获得任何与 knnMatch 的匹配?
Why can't I seem to get any matches with knnMatch using OpenCV with C++?
首先,我要说的是,到目前为止,我已经使用这篇关于这个主题的非常有趣的帖子来构建其中的很大一部分。
在提到的帖子中,该示例使用网络摄像头和 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
,所以它根本没有进入循环。
我的问题是,(即使两个原始图像相同)为什么没有匹配项?
您需要
使用detector.detect(object_1, kp_image );
检测object_1
中的关键点
之后,您可以按此处所示致电extractor.compute( object_1, kp_object, des_object );
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何在不产生任何垃圾的情况下获得C中的像素
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- C++映射有2个键,这样任何1个键都可以用来获取值
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- RtlCaptureStackBackTrace未捕获任何帧
- 链表c++插入,所有情况都已检查,但没有任何工作
- C++模板函数,用于比较任何无符号整数和有符号整数
- Arduino millis() - millis() 怎么能等于 0 以外的任何东西?
- 尝试摆脱任何堆内存分配
- 是否有任何C++功能可以对地图进行排序?
- 打印时有二叉树问题.用户输入不打印任何内容
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 在C++行尾写一个分号或多个分号是否会改变任何内容
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- C++ 将 CIN 值存储到任何类型的数组中
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- GStreamer在开始任何播放之前进行搜索
- 为什么我似乎无法使用 OpenCV 与 C++ 获得任何与 knnMatch 的匹配?