答案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通道。虽然有些混乱,但我不知道更好的方法。