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

5
我有一个大小为100x100x100的多维矩阵A,我想获取A的子矩阵,例如A[10:20, 20:30, 30:40]。当原始矩阵有两个维度时,OpenCV有一个Mat运算符来访问子矩阵,例如:A(Range(10,20), Range(20,30))
对于多维矩阵,是否有更有效的方法进行此访问?我问这个是因为我需要将子矩阵复制到另一个位置。

请问一下,这个图像是100行x 100列x 100平面x n通道,还是100行x 100列x 100通道? - Bull
1个回答

8

答案1

如果矩阵A是3D的,大小为100行x100列x100层x n个通道,您可以使用Mat Mat::operator()(const Range* ranges) const如下:

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将会是10x10x10 x n个通道。


答案2

然而,如果矩阵A是100行x 100列x 100通道,那就只是一个有100个通道的2D矩阵。您可以这样做:

Mat B = A(Range(10,20), Range(20,30));  // B will be 10x10x100

现在您需要从B中选择30:40通道,您需要使用void mixChannels(const Mat* src, size_t nsrcs, Mat* dst, size_t ndsts, const int* fromTo, size_t npairs)函数。请参考官方文档了解更多信息。
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);

根据要求,C将是10行x10列x10通道。虽然有些混乱,但我不知道更好的方法。


嗨,我尝试了你说的方法。但结果是B是一个1010100的矩阵。通道仍然是100而不是10。这里有什么问题吗? - user2970089
我更新了我的回答,听起来你有一个具有100个通道的2D图像。我的原始答案只适用于一个具有1个通道的3D图像。 - Bull

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接