在一些教程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]
?这到底发生了什么......
答案 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]]]