在OpenCV中叠加/合并两个(和更多)YUV图像

时间:2014-09-29 15:47:13

标签: c++ opencv image-processing merge yuv

我调查并删除了我之前的问题(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);

上面代码的结果如下所示: enter image description here

我猜图像没有被正确解释,所以图片保持黑/白(Y分量),在它们下面,我们可以看到U和V分量。有图像可以很好地描述问题(http://en.wikipedia.org/wiki/YUV):

enter image description here

和:http://upload.wikimedia.org/wikipedia/en/0/0d/Yuv420.svg

有没有办法正确读取这些值?我想我不应该将整个图像(它们的Y,U,V分量)直接复制到计算位置。 U和V组件应低于它们并按正确顺序排列,我是对的吗?

1 个答案:

答案 0 :(得分:0)

首先,有几种YUV格式,所以你需要清楚你正在使用哪种格式 根据您的图像,您的YUV格式似乎是Y'UV420p 无论如何,在那里转换为BGR工作然后转换回来要简单得多。

如果这不是一个选项,那么您几乎必须自己管理投资回报率。 YUV通常是平面格式,其中信道没有(完全)多路复用 - 并且一些具有不同的大小和深度。如果您不使用内部颜色转换,那么您必须知道确切的YUV格式并自行管理像素复制ROI。

对于YUV图像,CV_8UC*格式说明符并不意味着超出实际的内存要求。它当然没有指定像素/通道多路复用。

例如,如果你只想使用Y分量,那么Y通常是图像中的第一个平面,所以第一个"一半"可以将整个图像视为单色8UC1图像。在这种情况下,使用ROI很容易。