【发布时间】:2020-12-07 10:17:35
【问题描述】:
我对 OpenCV 完全陌生,但在创建矩阵时遇到了麻烦。我阅读了文档,在 stackoverflow 上浏览了类似的问题,为了我的爱,我无法弄清楚我做错了什么。
我正在使用 Visual Studio 2017 和 OpenCV 4.4.0 版
我正在尝试创建一个 8x8 矩阵并从数组中填充它。尺寸不正确,数据也不正确,所以我尝试用最小的矩阵做同样的事情,看看我做错了什么。
所以现在我尝试创建一个 2x2 矩阵。很简单,对吧?嗯,不完全是。 这是我使用的代码:
double data[2][2] = { {1.0, 2.0}, {3.0, 4.0} };
double data2[4] = { 1.0, 2.0, 3.0, 4.0 };
Mat *M = new Mat(2, 2, CV_64FC4, data);
我试过用二维数组做,我试过用一维数组做,问题总是一样的。 这是我打印矩阵时得到的输出
std::cout << "M = " << *M << std::endl << std::endl;
H = [1, 2, 3, 4, 9.844067014090074e-312, 4.639954332214191e-310, 9.84406421008967e-312, 4.639543499923437e-310;
9.844064273725325e-312, 9.844064194674822e-312, 9.844064050407653e-312, 9.844064042739754e-312, 9.844064050407653e-312, 9.844064050407653e-312, 9.844064050407653e-312, 9.844064050407653e-312]
你可以看到尺寸是2x8,内容是一些随机数。
我也试过不用指针来做
Mat M(2, 2, CV_64FC4, data);
但这甚至没有编译,给出Expected a type identifier.的错误
我到底做错了什么?
【问题讨论】:
-
因为像素类型
CV_64FC4有 4 个通道,所以它期望每个像素有 4 个double值。试试CV_64F -
@pptaszni 你给出了答案,而不是评论?
-
@ypnos 是的,因为我现在没有环境可以尝试。让我们等待 OP 确认它有效,我可以将其复制为答案。
-
这很尴尬。答案和评论都有效。我想这个评论更合适一些,因为如果我使用正确的类型,我的解决方案会起作用。
-
@Izak:小心你的所作所为。在您的代码示例中,您在堆栈上分配数组。因此,如果它超出范围,您的矩阵内容将被破坏。也许你只在一个很好的函数中使用矩阵。但是最好也在堆栈上创建矩阵对象来表示这一点。或者,如果您的数字是固定的,请使用静态数组(也可以在函数内,非常好)。