【问题标题】:How to access a sub-matrix of a multi-dimensional matrix in OpenCV function?如何在 OpenCV 函数中访问多维矩阵的子矩阵?
【发布时间】:2014-10-13 04:50:33
【问题描述】:

我有一个大小为 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 通道?

标签: c++ opencv matrix


【解决方案1】:

回答 1

如果 mat A 是 3D 100 rows x 100 cols x 100 planes x n channels,您可以像这样使用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 行 x 10 列 x 10 通道。这有点乱,但我不知道更好的方法。

【讨论】:

  • 嗨,我试过你说的。但事实证明,B 是一个 10*10*100 的矩阵。频道还是100不是10,是不是有问题?
  • 我更新了我的答案,听起来你有一个有 100 个通道的 2D 图像。我原来的答案,只满足 1 个通道的 3D 图像。
猜你喜欢
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多