cv::Mat 使用数组初始化

Posted

技术标签:

【中文标题】cv::Mat 使用数组初始化【英文标题】:cv::Mat initialization using array 【发布时间】: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

【问题讨论】:

能否提供minimal reproducible example? 【参考方案1】:

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

    从一个数组:

    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());
    

    使用逗号初始化器:

    Mat1f m3 = (Mat1f(2, 2) << 1.f, 2.f, 3.f, 4.f);
    

    如果矩阵很小,可以使用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

以上是关于cv::Mat 使用数组初始化的主要内容,如果未能解决你的问题,请参考以下文章

如何从字节数组初始化 RGBA cv::Mat?

CV::Mat介绍

OpenCV 使用 stride 从数组生成 cv::Mat

如何使用模板函数从缓冲区(T* 数据数组)创建 cv::Mat?

Mat 的几种初始化和赋值方法

从 3d 数组创建 cv::Mat 图像