C++ 如何在OpenCV函数中访问多维矩阵的子矩阵?

C++ 如何在OpenCV函数中访问多维矩阵的子矩阵?,c++,opencv,matrix,C++,Opencv,Matrix,我有一个大小为100x100x100的多维矩阵a,我想得到a的子矩阵,例如a[10:20,20:30,30:40]。当原始矩阵有两个维度时,OpenCV有一个Mat操作符来访问子矩阵,例如:a(范围(10,20),范围(20,30)) 对于多维矩阵,是否有任何有效的方法来访问?我问这个问题是因为我需要将子矩阵复制到另一个地方。答案1 如果mat A是3D 100行x 100列x 100个平面x n通道,则可以这样使用: std::vector<Range> ranges; range

我有一个大小为100x100x100的多维矩阵a,我想得到a的子矩阵,例如
a[10:20,20:30,30:40]
。当原始矩阵有两个维度时,OpenCV有一个Mat操作符来访问子矩阵,例如:
a(范围(10,20),范围(20,30))


对于多维矩阵,是否有任何有效的方法来访问?我问这个问题是因为我需要将子矩阵复制到另一个地方。

答案1

如果mat A是3D 100行x 100列x 100个平面x n通道,则可以这样使用:

std::vector<Range> ranges;
ranges.push_back(Range(10,20));
ranges.push_back(Range(20,30));
ranges.push_back(Range(30,40));

Mat B = A(&ranges[0]);
现在您需要从B中选择频道30:40,您需要使用:


根据需要,C将是10行x 10列x 10个通道。这有点乱,但我不知道更好的办法。

嗨,我试过你说的了。但事实证明B是一个10*10*100的矩阵。频道仍然是100个而不是10个。有什么问题吗?我更新了我的答案,听起来好像你有一个有100个频道的2D图像。我最初的回答是,只针对一个通道的3D图像。您能否澄清该图像是100行x 100列x 100个平面x n通道,还是100行x 100列x 100个通道?
Mat B = A(Range(10,20), Range(20,30));  // B will be 10x10x100
Mat C(10, 10, CV_MAKETYPE(A.depth(), 10));
int from_to[] = { 10,0, 11,1, 12,2, 13,3, 14,4,
                  15,5, 16,6, 17,7, 18,8, 19,9};
mixChannels(&B, 1, &C, 1, fromTo, 10);