【问题标题】:Create a 2 dimensional matrix from array in OpenCV从 OpenCV 中的数组创建二维矩阵
【发布时间】: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:小心你的所作所为。在您的代码示例中,您在堆栈上分配数组。因此,如果它超出范围,您的矩阵内容将被破坏。也许你只在一个很好的函数中使用矩阵。但是最好也在堆栈上创建矩阵对象来表示这一点。或者,如果您的数字是固定的,请使用静态数组(也可以在函数内,非常好)。

标签: c++ opencv matrix


【解决方案1】:

您尝试使用具有 4 个通道的 CV_64FC4 像素类型,因此每个元素需要 4 个 double 值。要创建 n x m cv::Mat,每个元素只有一个值,请使用 CV_64F 类型:

cv::Mat M(n, m, CV_64F, data);

【讨论】:

    【解决方案2】:

    在 C++ 中初始化cv::Mat 有很多正确的方法。最简单的是,如果您只是以平面形式呈现数据,然后相应地重塑矩阵。这个例子实际上来自 OpenCV 文档:

    std::vector<Point3f> vec;
    ...
    Mat pointMat = Mat(vec)    // convert vector to Mat, O(1) operation
                   .reshape(1) // make Nx3 1-channel matrix out of Nx1 3-channel.
                               // Also, an O(1) operation
                   .t();       // finally, transpose the Nx3 matrix.
                               // This involves copying all the elements
    

    Source

    在你的情况下:

    std::vector<double> data = { 1.0, 2.0, 3.0, 4.0 };
    Mat ret = Mat(data).reshape(2, 2);
    

    注意:这样,retdata 的包装。如果您想复制数据,请使用Mat(data, true)

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      相关资源
      最近更新 更多