opencv - 从 YV12 图像缓冲区创建 Mat 对象

标签 opencv yuv

我有一个缓冲区,其中包含 YV12 格式的图像。现在我想将此缓冲区转换为 RGB 格式或直接从中创建一个 Mat 对象!有人能帮我吗?我试过这段代码:

cv::Mat input(widthOfImg, heightOfImg, CV_8UC1, vy12Buffer);
cv::Mat converted;
cv::cvtColor(input, converted, CV_YUV2RGB_YV12);

最佳答案

这是可能的。

    cv::Mat picYV12 = cv::Mat(nHeight * 3/2, nWidth, CV_8UC1, yv12DataBuffer);
    cv::Mat picBGR;
    cv::cvtColor(picYV12, picBGR, CV_YUV2BGR_YV12);
    cv::imwrite("test.bmp", picBGR);  //only for test

Opencv color conversion flags

高度乘以 3/2,因为有 4 个 Y 样本,每 2x2 平方像素存储 1 U 和 1 V 样本。这导致字节样本与像素的比率为 3/2

4*1+1+1 samples per 2*2 pixels = 6/4 = 3/2

YV12 Format

更正:在最新版本的 OpenCV(我使用最旧的 2.4.13 版本)中,颜色转换代码更改为 COLOR_YUV2BGR_YV12

    cv::cvtColor(picYV12, picBGR, COLOR_YUV2BGR_YV12);

关于opencv - 从 YV12 图像缓冲区创建 Mat 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18737842/

相关文章:

android - 使用 Libyuv 将 YUV_420 _888 转换为 ARGB

ios - CVPixelBufferGetWidth(pixelbuffer) 和 CVPixelBufferGetWidthOfPlane(pixelbuffer, 0) 有什么区别?

python - 在第二台显示器中显示新窗口,opencv

java - OpenCV - Java - 使用 DescriptorMatcher 与 2 个相反的图像不匹配

c++ - 为什么imread加载图片后像素值为0?

unity3d - 用于 Unity 的 YUV 着色器?

matlab - 阅读未压缩的yuv视频文件的帧?

Delphi, TBitmap (rgb) 到 YCbCr 颜色格式

visual-studio-2010 - 将 OpenCV 2.4.2 与 Visual Studio 2010 链接起来

c++ - 将图像调整为正方形但保持纵横比 c++ opencv