【发布时间】:2013-10-04 19:41:12
【问题描述】:
例如,我有一个 4*5*6 的 3D 矩阵。我想把它分成6个二维矩阵。目的是对这些二维矩阵进行数据运算并得到结果。 尝试了 row()、rowRange(),我得到了错误。目前没有线索。有人提出更好的想法吗? 谢谢~
【问题讨论】:
例如,我有一个 4*5*6 的 3D 矩阵。我想把它分成6个二维矩阵。目的是对这些二维矩阵进行数据运算并得到结果。 尝试了 row()、rowRange(),我得到了错误。目前没有线索。有人提出更好的想法吗? 谢谢~
【问题讨论】:
请记住,最后一个索引变化最快,所以也许你的意思是你有一个 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。这通常更容易处理。
【讨论】: