我有一个例如4 * 5 * 6的3D矩阵。我想把它分成6个2D矩阵。目的是在这些2D矩阵上进行数据操作并获得结果。 尝试了row(),rowRange(),我收到了错误。现在没有线索。有人抛出更好的想法吗? 感谢〜
答案 0 :(得分:2)
请记住,最后一个索引变化最快,所以也许你的意思是你有一个6 * 5 * 4垫,并希望将它分成六个5x4垫。根据{{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。这往往更容易处理。