OpenCV cvtColor() 更改了我的图像尺寸并具有错误的颜色

OpenCV cvtColor() change my image dimensions and have wrong colors

本文关键字:有错误 颜色 图像 我的 cvtColor OpenCV      更新时间:2023-10-16

我正在使用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 的单通道(灰度(图像。当您尝试强行将此单通道图像从 YUV 4:2:0 转换为多通道 RGB 时,OpenCV 库假定每行具有完整 4:4:4 信息的 2/3(1 x height x width用于Y1/2 height x width用于UV,而不是3 x height x width用于普通YUV(,因此目标图像的宽度缩小到原始宽度的 2/3。可以假设从原始图像读取的数据中有一半来自未分配的内存,因为原始图像只有 width x height uchar s,但2 x width x height uchar是从内存中读取的!

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

可能是"作为参数传递的东西"没有足够的数据来填充 720 行。对于某些摄像机,并非所有三个通道都使用相同的位数表示。例如,在iPhone上捕获视频时,三个通道使用8-4-4字节而不是8-8-8。我没有在OpenCV上使用这种类型的相机,但很可能问题就在这里。