c++ - Opencv linemod 抛出匹配异常
问题描述
我想在 OpenCV 中使用 linemod。
我成功添加了一些模板,但是当我尝试进行一些匹配时,出现以下错误:
错误: cv::linemod::linearize 中的断言失败 (response_map.rows % T == 0),文件 ...\opencv\sources\modules\rgbd\src\linemod.cpp,第 1108 行
所有图像的推荐尺寸为 800x600 像素。
我的代码:
cv::Ptr<cv::linemod::Detector> detector = cv::linemod::getDefaultLINE();
cv::Mat color, mask;
std::vector<cv::Mat> images;
for (int i = 0; i < 419; i++)
{
images.push_back(cv::imread("Resources/Train/" + std::to_string(i+1) + ".png", CV_LOAD_IMAGE_GRAYSCALE));
}
for (int i = 0; i < images.size(); i++)
{
color = images[i];
// Create image mask
double thresh = 0;
double maxValue = 255;
// Binary Threshold
cv::threshold(color, mask, thresh, maxValue, cv::THRESH_BINARY);
std::vector<cv::Mat> sources;
sources.push_back(color);
// Extract template
std::string class_id = cv::format("class%d", num_classes);
cv::Rect bb;
int template_id = detector->addTemplate(sources, class_id, mask, &bb);
if (template_id != -1)
{
printf("*** Added template (id %d) for new object class %d***\n",
template_id, num_classes);
//printf("Extracted at (%d, %d) size %dx%d\n", bb.x, bb.y, bb.width, bb.height);
}
++num_classes;
}
std::vector<cv::Mat> sources;
sources.push_back(cv::imread("Resources/Train/1.png", CV_LOAD_IMAGE_GRAYSCALE));
std::vector<cv::linemod::Match> matches;
std::vector<cv::String> class_ids;
std::vector<cv::Mat> quantized_images;
detector->match(sources, 80, matches, class_ids, quantized_images); // ERROR
for (int i = 0; i < matches.size(); ++i)
{
cv::linemod::Match m = matches[i];
printf("Similarity: %5.1f%%; x: %3d; y: %3d; class: %s; template: %3d\n", m.similarity, m.x, m.y, m.class_id.c_str(), m.template_id);
}
错误被抛出detector->match(sources, 80, matches, class_ids, quantized_images);
解决方案
我知道真的很晚了,你已经解决了(有点)。但是对于其他会偶然发现同样问题的人......
cv::linemod::getDefaultLINE()
包含 2 个金字塔级别,分别为 5 和 8。但是对于 8 级的金字塔,pyrDown
执行(基本上按比例缩小 2 倍)。
也就是说,图像的大小应该是 5 和 16 的倍数(pyrmaid 级别的 8 乘以缩小因子 2),即80 的倍数。这就是错误的来源(600 不是 80 的倍数)。
推荐阅读
- javascript - 如何将 JQuery 与 getElementsById 一起使用?
- macos - Safari 中的屏幕共享功能如何工作?
- c# - 通过谷歌api创建文件夹到谷歌驱动器后没有得到文件夹ID作为响应
- ios - 在设置 Github Actions iOS 项目期间,进程完成并退出代码 66
- javascript - 如何在包含具有对象名称的对象的对象内的javascript中使用地图
- scala - 使用自定义 Scala 库列出配置的依赖项
- kubernetes - Kubernetes 混合配置映射和主机路径
- php - 使用 TAD 库无法连接考勤设备如何解决此问题
- r - 在等高线图中绘制不完整的 3D 数据
- selenium - 如何在 Chrome 或 Firefox 中获取绝对 XPath