【问题标题】:cv::Mat initialization using arraycv::Mat 使用数组初始化
【发布时间】:2017-07-07 08:21:43
【问题描述】:

我在初始化之后遇到了一个奇怪的行为

#include <iostream>
#include <opencv2/opencv.hpp>

int main() {
    cv::Mat h = cv::Mat(2, 2, CV_32F, {1.0, 2.0, 1.0, 0.0});
    std::cout << h << std::endl;
    return 0;
}

cout 打印出 [1, 1; 1, 1]。刚刚发生了什么?我在 ubuntu 上使用 eclipse,gcc 版本 5.4,OpenCV 3.2

【问题讨论】:

标签: c++ arrays opencv mat


【解决方案1】:

您没有使用有效的Mat 构造函数。您有几个选择:

  1. 从一个数组:

    float pf[] = { 1.f, 2.f, 3.f, 4.f };
    Mat1f m1(2, 2, pf);
    

    std::vector<float> vf = { 1.f, 2.f, 3.f, 4.f };
    Mat1f m2(2, 2, vf.data());
    
  2. 使用逗号初始化器:

    Mat1f m3 = (Mat1f(2, 2) << 1.f, 2.f, 3.f, 4.f);
    
  3. 如果矩阵很小,可以使用Matx

    Matx22f m4(1.f, 2.f, 3.f, 4.f);
    

请注意,Mat1fMat_&lt;float&gt; 的 typedef,它是 Mat 类型的 CV_32FC1


使用你的方法不起作用,因为{1.0, 2.0, 1.0, 0.0}构造cv::Scalar,所以你调用构造函数Mat(int rows, int cols, int type, cv::Scalar)。由于您只有 1 个通道,因此矩阵使用此标量的第一个值进行初始化,这是您的初始化列表中的第一个值。

请注意,这只是巧合,因为您的矩阵有 4 个元素(Scalars 支持的最大数量)。如果您使用更多的元素:

cv::Mat h(2, 3, CV_32F, {3.f, 2.f, 1.f, 0.f, 2.f, 5.f});

代码不应编译。

【讨论】:

  • 我的方法与你第一次使用数组初始化有什么不同?
  • 补充说明@YuZ
猜你喜欢
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多