在OpenCV中将RGB转换为YUYV

5
有没有一种方法可以将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);

enter image description here


我认为大小和类型是相同的。类型应该是3个uint8/uchar,在OpenCV中是Vec3b。步幅是两个连续行之间的长度,基本上是数据连续时的列数(如果有3个通道,则可能需要乘以3)。 - Miki
libyuv有什么问题吗?你愿意分享一下使用它的方法吗? - Alex Cohn
@AlexCohn 看起来由于某种原因它只有蓝色通道。 - Pavel Podlipensky
2
我会先检查原始文件。也许你对通道排序的假设是错误的。另一个嫌疑人是你的显示过程:也许它没有正确解释YUY2。 - Alex Cohn
1
似乎尽管该方法被称为ARGBToYUY2,但它需要BGRA通道顺序(不是反向)。@AlexCohn非常感谢您的支持和想法! - Pavel Podlipensky
显示剩余5条评论
1个回答

1

看起来,尽管该方法被称为ARGBToYUY2,但它需要BGRA通道顺序(而不是相反的顺序)。


这里是证明:https://github.com/Shamim1977/libyuv/blob/master/source/row_common.cc#L650 - Alex Cohn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接