在 OpenCV (C++) 中打印多维垫

Print multidimensional Mat in OpenCV (C++)

在 OpenCV 教程中

http://docs.opencv.org/master/d6/d6d/tutorial_mat_the_basic_image_container.html

下面是创建Mat的例子

int sz[3] = {2,2,2};
Mat L(3,sz, CV_8UC(1), Scalar::all(0));

这工作正常,但是当我尝试打印 Mat 时我的程序崩溃了。

cout << "L = " << endl << " " << L << endl << endl;

为什么这不起作用? 有没有办法在不循环或拆分 Mat L 的情况下做到这一点?

要打印 n-dim 矩阵,您可以使用矩阵切片。由于 2d 矩阵逐行存储,3d 矩阵逐平面存储等等,您可以使用代码:

cv::Mat sliceMat(cv::Mat L,int dim,std::vector<int> _sz)
{
cv::Mat M(L.dims - 1, std::vector<int>(_sz.begin() + 1, _sz.end()).data(), CV_8UC1, L.data + L.step[0] * 0);
return M;
}

要执行 mat slice.For 更多维度,您应该制作更多切片。示例显示 3 维和 4 维矩阵:

std::cout << "3 dimensions" << std::endl;

std::vector<int> sz = { 3,3,3 };

cv::Mat L;
L.create(3, sz.data(), CV_8UC1);
L = cv::Scalar(255);

std::cout<< sliceMat(L, 1, sz);

std::cout << std::endl;
std::cout <<"4 dimensions"<< std::endl;
sz = { 5,4,3,5 };
L.create(4, sz.data(), CV_8UC1);
L = cv::Scalar(255);
std::cout << sliceMat(sliceMat(L, 1, sz),2, std::vector<int>(sz.begin() + 1, sz.end()));

最终结果屏幕