Декодировать кадр из потока 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