gpt4 book ai didi

c++ - OpenCV cvtColor() 改变了我的图像尺寸并且有错误的颜色

转载 作者:太空宇宙 更新时间:2023-11-03 22:14:47 25 4
gpt4 key购买 nike

我正在使用 openCV C++ API,我正在尝试将相机缓冲区 (YUV_NV12) 转换为 RGB 格式。但是,我的图像尺寸发生了变化(宽度从 720 缩小到 480)并且颜色不正确(有点紫色/绿色)。

unsigned char* myYUVBufferPointer = (something passed as argument)
int myYUVBufferHeight = 1280
int myYUVBufferWidth = 720

cv::Mat yuvMat(myYUVBufferHeight, myYUVBufferWidth, CV_8U, myYUVBufferPointer);
cv::Mat rgbMat;
cv::cvtColor(yuvMat, rgbMat, CV_YUV2RGB_NV12);
cv::imwrite("path/to/my/image.jpg",rgbMat);

有什么想法吗? *(我对尺寸的变化比颜色更感兴趣,因为我最终会将其转换为 CV_YUV2GRAY_NV12 并且可以正常工作,但尺寸不是)。*

最佳答案

您的代码从一系列 unsigned char 中构造一个名为 yuvMat 的单 channel (灰度)图像。当您尝试——强行——将此单 channel 图像从 YUV 4:2:0 转换为多 channel RGB 时,OpenCV 库假定每一行具有完整 4:4:4 信息的 2/3(1 x height x width for Y and 1/2 height x width for U and V 每个,而不是普通 YUV3 x height x width) 因此目标图像的宽度缩小到原始宽度的 2/3。可以假设从原始图像读取的一半数据来自未分配的内存,因为原始图像只有 width x height uchar2 x width x height uchar 从内存中读取!

如果您的 uchar 缓冲区已经正确格式化为代表 YUV_NV12(4:2:0 子采样)的一系列字节,每个 channel 的传统 width x height 字节,您需要做的就是将您的原始 yuvMat 构建为 CV_8UC3,您就可以开始了。上面假设所有的隔行扫描和 channel 定位都已经在缓冲区中实现。但很可能情况并非如此。 YUV_NV12 数据带有 width x height ucharY,后面是 (1/2) width x (1/2) x height of 2 x uchars 表示 UV 组合。您可能需要编写自己的阅读器来分别读取YUV 数据,并构造 3 个单 channel Mat大小为 width x height -- 填充 UV channel 中的水平和垂直间隙 -- 然后使用cv::merge() 在使用 cv::cvtColor() 转换之前将这些单 channel 图像组合成 3 channel YUV该图像使用 CV_YUV2BGR 选项。请注意使用 BGR 而不是 RGB

关于c++ - OpenCV cvtColor() 改变了我的图像尺寸并且有错误的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17689262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com