【问题标题】:can't use copyTo to copy a rectangular matrix into a 3D matrix不能使用 copyTo 将矩形矩阵复制到 3D 矩阵中
【发布时间】:2012-01-22 03:38:05
【问题描述】:

我有 5rows x 4cols cv::Mat:

int output_size[] = {5,4};
cv::Mat im1(2, output_size, CV_32FC1);

float* ptr = (float*)im1.data;

for (unsigned int r = 0; r < output_size[0]; r++) {
  for (unsigned int c = 0; c < output_size[1]; c++) {
    *ptr = (r*im1.size.p[1])+c;
    std::cout << *ptr++ << ",";
  }
  std::cout << std::endl;
}

所以矩阵看起来像这样:

[ 0,  1,  2,  3,
  4,  5,  6,  7,
  8,  9, 10, 11,
 12, 13, 14, 15,
 16, 17, 18, 19]

此外,我还有另一个 3depth x 5rows x 4cols cv::Mat:

int output_size2[] = {3,5,4};
cv::Mat im2(3, output_size2, CV_32FC1);
im2 = 0;

现在我想将 im1 复制到 im2 的第二层。我执行以下操作:

cv::Range rngs[] = {cv::Range(1,2), cv::Range::all(), cv::Range::all()};
cv::Mat dst = im2(rngs);
im1.copyTo(dst);

这似乎不起作用。 im1.copyTo(dst) 对 im2 没有影响 - 所有第二层值在操作后保持为零。经过一番反省,似乎opencv发现由于dst的大小是1x5x4而不是5x4,它重新分配了dst。

将矩形矩阵复制到 3D 矩阵的一层的正确方法是什么?


好的,这可行:

void* ptr = im2.data + im2.step[0]*1;
memcpy(ptr, (void*)im1.data, im1.total()*sizeof(float));

但是有没有“opencv”的方法来解决它。

【问题讨论】:

    标签: opencv matrix


    【解决方案1】:

    如果您有 n 个 2-dim 图像并且您想将它们用作具有大小为 n 的第三维的 3D 矩阵中的层,您可以使用cv::merge。见documentation

    另见:

    cv:splitdocumentation

    【讨论】:

      猜你喜欢
      • 2018-07-31
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 2022-06-30
      • 1970-01-01
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多