Декодировать кадр из потока h264 в OpenCV Mat

Продукт: Bebop Версия продукта: Версия программного обеспечения v2.0.29 Версия SDK: ARSDK3_version_3_14_0 Использование libARController: Да Платформа SDK: UNIX Воспроизводимая с официальным приложением: НЕТ

Я пытался преобразовать ARCONTROLLER_Frame_t из ARSDK 3 в образ OpenCV с использованием Ubuntu 18.04, первоначально в предоставленном примере программы использовался MPlayer для открытия FIFO, где программа записывала все кадры, полученные от дрона, мне удалось получить изображения из указанного потока, используя ffmpeg во время его работы. Я также попытался дать OpenCV указанный файл для использования в качестве источника для VideoCapture, который работал, но был ужасно задержан. В настоящее время я пытаюсь дать OpenCV кадр за кадром.

Это скриншот определения ARCONTROLLER_Frame_t, документация очень расплывчатая о том, как все работает.

В настоящее время я получаю следующее изображение: Снимок экрана полученного изображения

Ранее я использовал это, чтобы попытаться декодировать его, предполагая, что оно было в формате RGB, это изображение реагирует на взаимодействие с камерой, поэтому я предполагаю, что это правильные данные:

void rawToMat(Mat &destImage, ARCONTROLLER_Frame_t &sourceImage) {
  if (sourceImage.used == 0) {
    return;
  }
  uchar *pointerImage = destImage.ptr(0);

  for (int i = 0; i < 480 * 856; i++) {
    pointerImage[3 * i] = sourceImage.data[3 * i + 2];
    pointerImage[3 * i + 1] = sourceImage.data[3 * i + 1];
    pointerImage[3 * i + 2] = sourceImage.data[3 * i];
  }
}

Но я обнаружил, что это обеспечивает тот же результат:

ARCONTROLLER_Frame_t newFrame = getCurrentFrame();
Mat currentImage = Mat(480, 856, CV_8UC3, newFrame.data);

Кто-нибудь знает способ получить реальное изображение из этого?

1 ответ

Решение

ARCONTROLLER_Frame_t не содержит изображения RGB; он содержит кадр H.264, который должен быть преобразован в изображение RGB с использованием декодера H.264 (например, см. этот ответ на форуме разработчиков Parrot).

Этот старый пример кода из Parrot демонстрирует, как декодировать фреймы с использованием библиотеки ffmpeg/libav (слишком много времени, чтобы публиковать здесь): https://github.com/Parrot-Developers/Samples/tree/59b6ba5cdc268fb6932d228db7b9169d9b69384c/Unix/BebopDroneDecodeStream

Другие вопросы по тегам