这段代码提供了将24位RGB图像转换为YUV420格式的详细过程,适用于需要进行视频编码或处理色彩空间转换的开发者。
将RGB24转换成YUV420的完整C++代码如下:
```cpp
#include
using namespace std;
void RGBtoYUV(unsigned char* rgb, unsigned char* yuv, int width, int height) {
const float rCoeff = 1.164f;
const float gCoeff = -0.392f;
const float bCoeff = -0.581f;
for (int i = 0; i < height; ++i) {
for (int j = 0; j < width; ++j) {
int indexRGB = (i * width + j) * 3;
unsigned char r = rgb[indexRGB];
unsigned char g = rgb[indexRGB + 1];
unsigned char b = rgb[indexRGB + 2];
float y = rCoeff * r + gCoeff * g + bCoeff * b;
indexRGB += (width*height)*3; // 跳到UV部分
int indexYUV = i / 2 * width/2+j/2;
if ((i % 2 == 0) && (j % 2 == 0)) {
yuv[indexYUV] = static_cast(y + 16);
}
// 计算U
float uCoeff = -0.581f * r - 0.419f * g + 0.3742;
unsigned char u = bCoeff * b + gCoeff * g + rCoeff * r;
indexYUV += (width*height)/4; // 跳到V部分
if ((i % 2 == 0) && (j % 2 == 1)) {
yuv[indexYUV] = static_cast(u + 128);
}
// 计算V
float vCoeff = -0.374f * r + -0.769f * g + 0.581;
u = bCoeff * b + gCoeff * g + rCoeff * r;
indexYUV += (width*height)/4; // 跳到V部分
if ((i % 2 == 1) && (j % 2 == 0)) {
yuv[indexYUV] = static_cast(vCoeff*r - bCoeff*b + gCoeff*g + rCoeff *r);
}
}
}
}
```
上述代码实现了将RGB格式的图像数据转换为YUV420格式。注意,这里提供的只是一个简化版本,并且在实际应用中可能需要进行一些调整以确保准确性和性能优化。
请注意:此示例仅用于说明如何实现从RGB到YUV的色彩空间转换过程,具体实现细节可能会根据不同的需求和应用场景有所不同。