OpenCV cvtColor() 更改了我的图像尺寸并具有错误的颜色
OpenCV cvtColor() change my image dimensions and have wrong colors
我正在使用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
用于Y
,1/2 height x width
用于U
和V
,而不是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
组合。您可能需要编写自己的阅读器来分别读取Y
、U
和V
数据,并构建 3 个大小width x height
的单通道Mat
- 填充U
和V
通道中的水平和垂直间隙 - 然后使用 cv::merge()
将这些单通道图像组合成 3 通道YUV
,然后再使用 cv::cvtColor()
使用CV_YUV2BGR
选项转换该图像。请注意使用 BGR
而不是 RGB
。
可能是"作为参数传递的东西"没有足够的数据来填充 720 行。对于某些摄像机,并非所有三个通道都使用相同的位数表示。例如,在iPhone上捕获视频时,三个通道使用8-4-4字节而不是8-8-8。我没有在OpenCV上使用这种类型的相机,但很可能问题就在这里。
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 我的代码中有错误,未声明的标识符
- C++ LeetCode #377 的 DP 解决方案中,此代码是否有错误?
- 试图建立银行管理系统,但有错误
- 我试图创建临时对象的方式有错误吗
- 我的随机生成器是否不工作,或者我决定人/骨架是否击中对手的方式是否有错误
- 我在OpenCV中有错误的"approxPolyDP(ROI_Vertices, ROI_Poly, 1.0, true)"
- 我在这个 C++ 代码上有错误吗?
- 是视觉C++优化器错误还是我的代码中有错误?
- 为什么一个简单的C++程序会有错误的结果?是 #define 引起的吗?
- 对此有错误
- C :数据文件有错误:预期的无限制ID
- 一个带有参数的程序,为什么此程序有错误的答案
- 仅使用boost.datetime在Windows上有错误
- 使用向量循环时,是否有错误
- Microsoft Visual Studio发现我所有的CUDA设备端函数都有错误
- 继承默认构造函数在 gcc 中失败并在 clang 中工作,哪个有错误?
- 为什么有错误未定义_getws_s
- 在快速排序程序中有错误
- C - 检查CIN是否有错误