Конвертировать из RGB в YUYV в OpenCV

Есть ли способ конвертировать из RGB в формат YUYV (YUY 4:2:2)? Я отметил, что OpenCV имеет обратную работу, но не RGB для YUYV по некоторым причинам. Может быть, кто-то может указать на код, который делает это (даже за пределами библиотеки OpenCV)?

ОБНОВИТЬ

Я нашел библиотеку libyuv, которая может работать для этой цели, выполнив преобразование BGR в ARGB, а затем в формат ARGB в YUY2 (надеюсь, это то же самое, что и YUYV 4:2:2). Но это не похоже на работу. Вы случайно не знаете, как должен выглядеть размер / тип буфера yuyv? Каков его шаг?

Для уточнения YUYV и YUY2 одинаковые форматы, если это помогает.

ОБНОВЛЕНИЕ 2 Вот мой код использования библиотеки libyuv:

  Mat frame;
  // Convert original image im from BGR to BGRA for further use in libyuv
  cvtColor(im, frame, CVX_BGR2BGRA);
  // Actually libyuv requires ARGB (i.e. reverse of BGRA), so I swap channels here
  int from_to[] = { 0,3, 1,2, 2,1, 3,0 };
  mixChannels(&frame, 1, &frame, 1, from_to, 4);
  // This is the most confusing part. Not sure what argb_stride suppose to be - length of a row in bytes or size of single value in the array?
  const uint8_t* argb_data = frame.data;
  int argb_stride = 8;

  // Also it is not clear what size of yuyv frame should be since we duplicate one Y 
  Mat yuyv(frame.rows, frame.cols, CVX_8UC2);
  uint8_t* yuyv_data = yuyv.data;
  int yuyv_stride = 16;
  // Do actual conversion
  libyuv::ARGBToYUY2(argb_data, argb_stride, yuyv_data, yuyv_stride, 
  frame.cols, frame.rows);
  // Then I feed yuyv_data to video stream buffer and see green or purple image instead of video stream.

ОБНОВЛЕНИЕ 3

  Mat frame;
  cvtColor(im, frame, CVX_BGR2BGRA);

  // ARGB
  int from_to[] = { 0,3, 1,2, 2,1, 3,0 };
  Mat rgba(frame.size(), frame.type());
  mixChannels(&frame, 1, &rgba, 1, from_to, 4);
  const uint8_t* argb_data = rgba.data;
  int argb_stride = rgba.cols*4;

  Mat yuyv(rgba.rows, rgba.cols, CVX_8UC2);
  uint8_t* yuyv_data = yuyv.data;
  int yuyv_stride = width * 2;
  int res = libyuv::ARGBToYUY2(argb_data, argb_stride, yuyv_data, yuyv_stride, rgba.cols, rgba.rows);

введите описание изображения здесь

1 ответ

Похоже, что хотя метод и называется ARGBToYUY2, для него требуется порядок каналов BGRA (не обратный).

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