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

Posted

技术标签:

【中文标题】如何使用opencv C ++将3D矩阵划分为2D矩阵束【英文标题】:How to divide 3D matrix into bunches of 2D matrix with opencv C++ 【发布时间】:2013-10-04 19:41:12 【问题描述】:

例如,我有一个 4*5*6 的 3D 矩阵。我想把它分成6个二维矩阵。目的是对这些二维矩阵进行数据运算并得到结果。 尝试了 row()、rowRange(),我得到了错误。目前没有线索。有人提出更好的想法吗? 谢谢~

【问题讨论】:

【参考方案1】:

请记住,最后一个索引变化最快,所以也许你的意思是你有一个 6*5*4 的垫子,想把它分成六个 5x4 的垫子。根据documentation“3维矩阵逐平面存储”。

但是,假设您的 3D Mat 是这样创建的:

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

你可以做这样的事情来做你所要求的(但可能不是你真正想要的):

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

但是,要从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);

因为 OpenCV 中对 3D Mats 的支持不是很好,所以尽量避免使用它们。 另一种方法是使用具有多个通道的 2D Mat。这通常更容易处理。

【讨论】:

其实4*5*6的意思是有6个平面(大小:4*5)。将 3D 划分为通道是 opencv 的初衷。我不知道如何有效地使用它。你的回答解决了我的困惑。我非常感谢您的帮助。对opencv非常了解!

以上是关于如何使用opencv C ++将3D矩阵划分为2D矩阵束的主要内容,如果未能解决你的问题,请参考以下文章

将 3D MatND 拆分为 2D Mat opencv 的向量

C#texture2d如何转换为cpu图像

如何在opencv中将图像转换为矩阵[重复]

如何使用 opencv 库将 3D 矩阵的元素归零?

整数到 const c++, c

如何使用opencv将图像转换为Python中的矩阵