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

Posted

技术标签:

【中文标题】在 OpenCV (C++) 中打印多维 Mat【英文标题】:Print multidimensional Mat in OpenCV (C++) 【发布时间】:2017-10-04 08:40:47 【问题描述】:

在 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 的情况下做到这一点?

【问题讨论】:

崩溃时会显示什么错误消息(如果有)? 据我所知,多维数组没有 @hammeramr 错误消息可能是 dims @hammeramr 控制台输出是Exception thrown at 0x00007FF909679E08 in OpenCV_tutorial_coremodule_1.exe: Microsoft C++ exception: cv::Exception at memory location 0x000000BFD9F6D150. Unhandled exception at 0x00007FF909679E08 in OpenCV_tutorial_coremodule_1.exe: Microsoft C++ exception: cv::Exception at memory location 0x000000BFD9F6D150.,这对我来说毫无意义。然而 Stacktrace 指向 std::ostream operatorKamilSzelag 描述的问题。 【参考方案1】:

要打印 n-dim 矩阵,您可以使用 Matrix 切片。由于 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。对于更多维度,您应该制作更多切片。示例显示了 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()));

最终结果屏幕

【讨论】:

很好的答案。你可以看看这个:***.com/questions/46547531/…? int dim在 sliceMat 函数中有什么用处?

以上是关于在 OpenCV (C++) 中打印多维 Mat的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV c++ Mat MADNESS

[OpenCV学习笔记2][Mat数据类型和操作]

opencv编程中cvMat到Mat如何进行数据转换?

opencv中MatND和Mat的区别

OpenCV C++ 多线程

opencv 数据类型转换:CvArr, Mat, CvMat, IplImage, BYTE 转