目前工程中几种图像存储方式的区别(YUV422I_YUYV&YUV420)

本文深入解析YUV422I_YUYV与YUV420SP图像存储方式的区别,纠正了对交错和逐行扫描误解,并详细阐述了TI提供的存储方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、原始可用加算法:YUV422I_YUYV

 

YUYV为YUV422采样的存储格式中的一种,相邻的两个Y共用其相邻的两个Cb、Cr,分析,对于像素点Y'00、Y'01 而言,其Cb、Cr的值均为 Cb00、Cr00,其他的像素点的YUV取值依次类推。

二、我现在用的YUV420SP

三、TI给的存储方式


看这块的时候还把图像的逐行扫描和隔行扫描与图像的存储方式搞混了。误以为YUV422I中的I(interlace)就是隔行的意思,YUV420P就是逐行(progressives)的意思,后来一琢磨才想清楚这里面的I是交错的意思,P是平面的意思,并不是我之前理解的意思,扫描方式和存储方式完全是两码事,我现在用的420SP是解码过来的图像,肯定是逐行的。

PixelType_Gvsp_YUV422_YUYV_Packed通常是指一种视频流数据格式,其中YUV422格式通过打包的方式存储,比如将两个偶数行的Y分量和奇数行的U/V分量相邻存储。要在Qt中将这种格式转换成 QImage 对象,你需要按照特定的像素顺序解码并创建QImage。 以下是一个简化的步骤: 1. **数据解析**: - 首先,从数据流中按正确的YUV422 YUYV打包模式提取像素数据。 - Y分量占据四个字节(16位),而U和V各占两个字节(16位)。 2. **内存分配**: - 创建一个临时数组来存放解包后的像素数据,注意要保证足够的空间,因为一帧可能包含很多像素。 3. **像素布局**: - QImage 使用的是 RGB 或 BGR 格式,所以需要将YUV数据转换成RGB格式,例如Bayer RGGB (如果YUV422 YUYV表示的是RGGB排列)。 4. **填充QImage**: - 使用`QImage::create()`函数创建一个新的QImage,指定宽度、高度和颜色深度。 - 使用`pixelData()`获取像素数据指针,并将处理后的RGB数据复制到这个内存区域。 5. **设置图像信息**: - 设置QImage的尺寸(宽度和高度)以及色彩空间,通常为QImage::Format_RGB888或其他合适的格式。 ```cpp // 示例代码,假设data是原始数据缓冲区 uchar* yuv_data = data; int width = ...; // 解析得到的实际宽度 int height = ...; // 解析得到的实际高度 // 转换为RGB数据 uchar* rgb_data = new uchar[width * height * 3]; for (int i = 0; i < height; ++i) { for (int j = 0; j < width / 2; ++j) { int pixel_index = (i * width + j * 2) * 3; // RGB三通道偏移 rgb_data[pixel_index] = yuv_data[i * 2]; // Y rgb_data[pixel_index + 1] = yuv_data[(i * 2 + 1) * 2]; // U rgb_data[pixel_index + 2] = yuv_data[(i * 2 + 1) * 2 + 1]; // V (这里假设是RGGB) } } // 创建QImage QImage qi(width, height, QImage::Format_RGB888); qi.bits() = rgb_data; // 清理 delete[] rgb_data; // 现在你可以使用qi作为QImage对象进行操作了 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值