逗号分隔初始化器为mutli-dimensional cv :: Mat

时间:2017-10-13 17:22:31

标签: c++ opencv multidimensional-array

在一些教程e.g. this one中,展示了如何使用逗号分隔列表初始化opencv 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]?这到底发生了什么......

1 个答案:

答案 0 :(得分: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可以是连续的1D数据指针。 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]]]