【问题标题】:comma separated initializer for mutli-dimensional cv::Mat多维 cv::Mat 的逗号分隔初始化程序
【发布时间】:2025-12-13 06:15:01
【问题描述】:

在许多教程e.g. this one 中,展示了如何使用逗号分隔列表初始化 opencv Mat。但是,当我尝试使用多维 Mat 这样做时,我感到很奇怪。

#include "opencv2/core/core.hpp"
#include <iostream>

int main() {
    cv::Mat vect = (cv::Mat_<double>(2, 2, CV_8UC3) << 1,2,3,4,5,6,7,8,9,10,11,12);
    std::cout << "vect = " << std::endl << " " << cv::format(vect,"python") << std::endl;
    return 12345;
}

输出:

vect = 
 [[1, 2], 
  [3, 4]]

可以显式初始化多维 Mat 吗?

编辑:我也无法以其他方式初始化它。

int main() {
    int data[2][2][3] = {
        {
            {1,2,3},
            {4,5,6}
        },
        {
            {7,8,9},
            {10,11,12}
        }
    };
    cv::Mat vect = cv::Mat(2, 2, CV_8UC3, data);
    std::cout << "vect = " << std::endl << " " << cv::format(vect,"python") << std::endl;
    return 54321;
}

输出:

vect = 
 [[[1, 0, 0], [0, 2, 0]], 
  [[0, 0, 3], [0, 0, 0]]]

所以我的输入数组中 [0][0][1] 的元素最终在 Mat 中的 [0][1][1] ?这里到底发生了什么……

【问题讨论】:

    标签: c++ opencv multidimensional-array


    【解决方案1】:

    对于模板Mat_,没有采用Mat_(int rows, int cols, int type)source here 的重载函数。

    cv::Mat vect = (cv::Mat_<double>(3,4) << 1,2,3,4,5,6,7,8,9,10,11,12);
    std::cout << "vect = " << std::endl << " " <<cv::format(vect,Formatter::FMT_PYTHON) << std::endl;
    

    输出:

    vect = 
     [[1, 2, 3, 4],
     [5, 6, 7, 8],
     [9, 10, 11, 12]]
    

    对于非模板 Mat 你不需要将多维数组作为数据指针参数,Mat::data 可以是一个连续的一维数据指针。 Mat 构造函数将处理参数中提供的通道、行和列。

    uchar data[] = {1,2,3,4,5,6,7,8,9,10,11,12};
    Mat vect(2,2,CV_8UC3,data);
    std::cout << "vect = " << std::endl << " " << cv::format(vect,Formatter::FMT_PYTHON) << std::endl;
    

    输出:

    vect = 
     [[[  1,   2,   3], [  4,   5,   6]],
     [[  7,   8,   9], [ 10,  11,  12]]]
    

    【讨论】: