简体   繁体   English

如何使用OpenCV C ++将3D矩阵划分为2D矩阵束

[英]How to divide 3D matrix into bunches of 2D matrix with opencv C++

I have a, for example, 4*5*6 3D matrix. 我有一个4 * 5 * 6 3D矩阵。 I would like to divide it into 6 2D matrix. 我想将其分为6个2D矩阵。 The purpose is to make data operation on these 2D matrix and get results. 目的是对这些2D矩阵进行数据运算并获得结果。 Tried row(), rowRange(), I got errors. 尝试过row(),rowRange(),我遇到了错误。 No clues right now. 现在没有任何线索。 Anyone throw any better ideas? 有人提出更好的主意吗? Thanks~ 谢谢〜

Remember that last index varies fastest, so maybe you mean you have a 6*5*4 Mat and would like to divide it into six 5x4 Mats. 请记住,最后一个索引变化最快,所以也许您的意思是您有一个6 * 5 * 4的Mat,并且希望将其分为六个5x4的Mat。 According to the documentation "3-dimensional matrices are stored plane-by-plane". 根据文档 “ 3维矩阵按平面存储”。

However, assuming your 3D Mat was created like this: 但是,假设您的3D Mat是这样创建的:

int dims[] = {4, 5, 6};
Mat m3(3, dims, CV_8UC1, data);

You can do something like this to do what you asked (but possibly not what you actually want): 您可以执行以下操作来执行您要求的操作(但可能不是您真正想要的操作):

Mat m2(4, 30, CV_8UC1, m3.data);
Mat m2x6 = m2.reshape(6);
std::vector<cv::Mat> channels;
cv::split(m2x6, channels);

However, to get out 4 images from m3 that have 5 rows x 6 cols: 但是,要从m3中提取4幅图像,这些图像具有5行x 6列,请执行以下操作:

Mat p0(5, 6, CV_8UC1, m3.data + m3.step[0] * 0);
Mat p1(5, 6, CV_8UC1, m3.data + m3.step[0] * 1);
Mat p2(5, 6, CV_8UC1, m3.data + m3.step[0] * 2);
Mat p3(5, 6, CV_8UC1, m3.data + m3.step[0] * 3);

Because support for 3D Mats in OpenCV is not great, avoid using them if you can. 因为在OpenCV中对3D Mats的支持不是很好,所以请避免使用它们。 An alternative would be to use a 2D Mat that has multiple channels. 一种替代方法是使用具有多个通道的2D Mat。 That is often much easier to handle. 这通常更容易处理。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM