例如,我有一个 4*5*6 的 3D 矩阵。我想把它分成6个二维矩阵。目的是对这些二维矩阵进行数据运算并得到结果。尝试了 row()、rowRange(),我遇到了错误。目前没有任何线索。有人提出更好的想法吗?谢谢~
请记住,最后一个索引变化最快,所以也许你的意思是你有一个 6*5*4 的垫子,并想把它分成六个 5x4 的垫子。根据文档“3维矩阵逐平面存储”。
但是,假设您的 3D Mat 是这样创建的:
int dims[] = {4, 5, 6};
Mat m3(3, dims, CV_8UC1, data);
Run Code Online (Sandbox Code Playgroud)
你可以做这样的事情来做你问的(但可能不是你真正想要的):
Mat m2(4, 30, CV_8UC1, m3.data);
Mat m2x6 = m2.reshape(6);
std::vector<cv::Mat> channels;
cv::split(m2x6, channels);
Run Code Online (Sandbox Code Playgroud)
但是,要从m3中取出5 行 x 6 列的4 个图像:
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);
Run Code Online (Sandbox Code Playgroud)
因为 OpenCV 中对 3D Mats 的支持不是很好,所以尽可能避免使用它们。另一种方法是使用具有多个通道的 2D Mat。这通常更容易处理。