Я пытаюсь загрузить изображение в mex-скрипте и привести его к соответствующему формату, который использует библиотека Open3D, т.е. three::Image
. Я использую следующий код:
uint8_t* rgb_image = (uint8_t*) mxGetPr(prhs[3]);
int* dims = (int*) mxGetDimensions(prhs[3]);
int height = dims[0];
int width = dims[2];
int channels = dims[4];
int imsize = height * width;
Image image;
image.PrepareImage(height, width, 3, sizeof(uint8_t)); // parameters: height, width, num_of_channels, bytes_per_channel
memcpy(image.data_.data(), rgb_image, image.data_.size());
Вышеуказанное хорошо работает, когда я даю изображение в градациях серого и указываю num_of_channels
на 1, но не для 3-канальных изображений, как вы можете заметить ниже:
Затем я попытался создать функцию, в которой я вручную перебираю необработанные данные и присваиваю их выходному изображению
auto image_ptr = std::make_shared<Image>();
image_ptr->PrepareImage(height, width, channels, sizeof(uint8_t));
for (int i = 0; i < height * width; i++) {
uint8_t *p = (uint8_t *)(image_ptr->data_.data() + i * channels * sizeof(uint8_t));
*p++ = *rgb_image++;
}
Но теперь кажется, что цветовые каналы назначены неправильно:
Есть идеи, как решить эту проблему. Дело в том, что это кажется чем-то простым, но поскольку мои знания по C ++ и указателям весьма ограничены, я не могу понять это прямо.
Я нашел это решение и здесь ( Чтение изображения в matlab в формате, приемлемом для mex ), но я не уверен, как именно я могу его использовать. Честно говоря, я в замешательстве.