c++ yuv422怎么转化为RGB图像然后把rgb图像拆分成3张r/g/b对的raw8_mono,怎么实现
时间: 2023-12-14 20:39:56 浏览: 258
将 YUV422 转换为 RGB 可以使用以下公式:
```
R = Y + 1.402 * (V-128)
G = Y - 0.34414 * (U-128) - 0.71414 * (V-128)
B = Y + 1.772 * (U-128)
```
其中 Y、U、V 表示原始图像的亮度和色度数据,分别占据不同的字节位置。具体来说,每两个像素共用 4 个字节,前两个字节表示一个像素的亮度 Y,后面一个字节中高 4 位表示第一个像素的色度 U,低 4 位表示第二个像素的色度 V。
因此,对于一张 YUV422 图像,需要将其像素数据按照上述格式解析出来,然后使用上述公式计算出 RGB 值,最终将 RGB 值拆分成 R、G、B 三个分量,分别存储到不同的 raw8_mono 图像中。
以下是一个简单的 C++ 实现示例:
```cpp
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
// 将 YUV422 转换为 RGB 并拆分成 R/G/B 三个分量
void yuv422_to_rgb(const vector<uint8_t>& yuv, vector<uint8_t>& r, vector<uint8_t>& g, vector<uint8_t>& b, int width, int height) {
r.resize(width * height);
g.resize(width * height);
b.resize(width * height);
for (int i = 0; i < width * height * 2; i += 4) {
int y1 = yuv[i];
int u = yuv[i+1] - 128;
int y2 = yuv[i+2];
int v = yuv[i+3] - 128;
int r1 = y1 + 1.402 * v;
int g1 = y1 - 0.34414 * u - 0.71414 * v;
int b1 = y1 + 1.772 * u;
int r2 = y2 + 1.402 * v;
int g2 = y2 - 0.34414 * u - 0.71414 * v;
int b2 = y2 + 1.772 * u;
r[i/4*2] = r1;
g[i/4*2] = g1;
b[i/4*2] = b1;
r[i/4*2+1] = r2;
g[i/4*2+1] = g2;
b[i/4*2+1] = b2;
}
}
int main() {
ifstream fin("input.yuv", ios::binary);
vector<uint8_t> yuv(640 * 480 * 2);
fin.read((char*)&yuv[0], yuv.size());
vector<uint8_t> r, g, b;
yuv422_to_rgb(yuv, r, g, b, 640, 480);
ofstream fout_r("output_r.raw", ios::binary);
fout_r.write((char*)&r[0], r.size());
ofstream fout_g("output_g.raw", ios::binary);
fout_g.write((char*)&g[0], g.size());
ofstream fout_b("output_b.raw", ios::binary);
fout_b.write((char*)&b[0], b.size());
return 0;
}
```
其中,`input.yuv` 是输入的 YUV422 文件名,`output_r.raw`、`output_g.raw`、`output_b.raw` 分别是输出的 R/G/B 三个 raw8_mono 文件名。注意,输出的 raw8_mono 文件需要使用其他软件或工具进行可视化。
阅读全文