невозможно использовать copyTo для копирования прямоугольной матрицы в 3D-матрицу - PullRequest
1 голос
/ 22 января 2012

у меня есть 5 рядов х 4 протокола 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.

Как правильно скопировать прямоугольную матрицу в один слой трехмерной матрицы?


Хорошо, это работает:

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

но есть ли "opencv" способ решить эту проблему.

1 Ответ

1 голос
/ 22 января 2012

Если у вас есть n 2-мерных изображений, и вы хотите использовать их в качестве слоев в трехмерной матрице с третьим измерением размера n, вы можете использовать cv::merge.см. документацию .

См. также:

cv:split документация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...