我有一个大小为100x100x100的多维矩阵A,我希望得到一个A的子矩阵,例如A[10:20, 20:30, 30:40]
。当原始矩阵有两个维度时,OpenCV有一个Mat运算符来访问子矩阵,例如:A(Range(10,20), Range(20,30))
对于多维矩阵,有没有有效的方法来进行此访问?我问这个是因为我需要将子矩阵复制到另一个地方。
答案 0 :(得分:4)
回答1
如果mat A是3D 100行x 100 cols x 100 plane 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行×100列×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行×10列×10个通道。这有点乱,但我不知道更好的方法。