我调查并删除了我之前的问题(Is there a way to avoid conversion from YUV to BGR?)。我想在生成的更大的图像上叠加几张图像(格式为YUV)(想想它就像是画布)并通过网络库(OPAL)向前发送,而不将其转换为BGR。
以下是代码:
Mat tYUV;
Mat tClonedYUV;
Mat tBGR;
Mat tMergedFrame;
int tMergedFrameWidth = 1000;
int tMergedFrameHeight = 800;
int tMergedFrameHalfWidth = tMergedFrameWidth / 2;
tYUV = Mat(tHeader->height * 1.5f, tHeader->width, CV_8UC1, OPAL_VIDEO_FRAME_DATA_PTR(tHeader));
tClonedYUV = tYUV.clone();
tMergedFrame = Mat(Size(tMergedFrameWidth, tMergedFrameHeight), tYUV.type(), cv::Scalar(0, 0, 0));
tYUV.copyTo(tMergedFrame(cv::Rect(0, 0, tYUV.cols > tMergedFrameWidth ? tMergedFrameWidth : tYUV.cols, tYUV.rows > tMergedFrameHeight ? tMergedFrameHeight : tYUV.rows)));
tClonedYUV.copyTo(tMergedFrame(cv::Rect(tMergedFrameHalfWidth, 0, tYUV.cols > tMergedFrameHalfWidth ? tMergedFrameHalfWidth : tYUV.cols, tYUV.rows > tMergedFrameHeight ? tMergedFrameHeight : tYUV.rows)));
namedWindow("merged frame", 1);
imshow("merged frame", tMergedFrame);
waitKey(10);
上面代码的结果如下所示:
我猜图像没有被正确解释,所以图片保持黑/白(Y分量),在它们下面,我们可以看到U和V分量。有图像可以很好地描述问题(http://en.wikipedia.org/wiki/YUV):
和:http://upload.wikimedia.org/wikipedia/en/0/0d/Yuv420.svg
有没有办法正确读取这些值?我想我不应该将整个图像(它们的Y,U,V分量)直接复制到计算位置。 U和V组件应低于它们并按正确顺序排列,我是对的吗?
答案 0 :(得分:0)
首先,有几种YUV格式,所以你需要清楚你正在使用哪种格式 根据您的图像,您的YUV格式似乎是Y'UV420p 无论如何,在那里转换为BGR工作然后转换回来要简单得多。
如果这不是一个选项,那么您几乎必须自己管理投资回报率。 YUV通常是平面格式,其中信道没有(完全)多路复用 - 并且一些具有不同的大小和深度。如果您不使用内部颜色转换,那么您必须知道确切的YUV格式并自行管理像素复制ROI。
对于YUV图像,CV_8UC*
格式说明符并不意味着超出实际的内存要求。它当然没有指定像素/通道多路复用。
例如,如果你只想使用Y分量,那么Y通常是图像中的第一个平面,所以第一个"一半"可以将整个图像视为单色8UC1
图像。在这种情况下,使用ROI很容易。