C++图像处理NV21转RGBA颜色空间的转换算法

最近做的项目涉及到NV21转RGBA,网上找到的方法黑白图像显示正常,但是加上伪彩后颜色不对,折腾了好几天还是不行。最后只好研究YUV原理,才弄明白网上的算法有疏漏,修改后再运行程序,图像的颜色终于显示正常了,这里把最终的算法记录一下,希望能给大家提供帮助。

void libyuvNV21ToRGBA(const unsigned char *src, unsigned char *dst, int width, int height, int mode) {

    //nv21
    int total = width * height;
    char Y, U, V;
    float R, G, B;
    int index = 0;


    for (int h = 0; h < height; h++) {
        for (int w = 0; w < width / 2; w++) {

            Y = src[h * width + w * 2];
            V = src[total + (h >> 1) * width + w * 2];
            U = src[total + (h >> 1) * width + w * 2 + 1];
            R = Y + 1.4075 * (V - 128);
            G = Y - 0.3455 * (U - 128) - 0.7169 * (V - 128);
            B = Y + 1.779 * (U - 128);

            if (R < 0) R = 0;
            if (R > 255) R = 255;
            if (G < 0) G = 0;
            if (G > 255) G = 255;
            if (B < 0) B = 0;
            if (B > 255) B = 255;

            dst[index++] = B;
            dst[index++] = G;
            dst[index++] = R;
            dst[index++] = 255;

            Y = src[h * width + w * 2 + 1];
            R = Y + 1.4075 * (V - 128);
            G = Y - 0.3455 * (U - 128) - 0.7169 * (V - 128);
            B = Y + 1.779 * (U - 128);

            if (R < 0) R = 0;
            if (R > 255) R = 255;
            if (G < 0) G = 0;
            if (G > 255) G = 255;
            if (B < 0) B = 0;
            if (B > 255) B = 255;

            dst[index++] = B;
            dst[index++] = G;
            dst[index++] = R;
            dst[index++] = 255;
           }
        }
	}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值