Декодировать кадр из потока h264 в OpenCV Mat - PullRequest
0 голосов
/ 28 августа 2018

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

Я пытался преобразовать 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 Ответ

0 голосов
/ 31 августа 2018

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

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

...