有没有办法从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);
最佳答案
看来,尽管该方法称为ARGBToYUY2,但它需要 channel 的BGRA顺序(不是反向的)。
关于c++ - 在OpenCV中从RGB转换为YUYV,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39876798/