YUV(yuv422、yuv420p、yuv420sp) convert to RGB

逆熵闭包
• 阅读 3467
    void convert_yuv420p_to_rgb_buffer(unsigned char* yuv, unsigned char* rgb, unsigned int width, unsigned int height)
    {
        int y, u, v;
        int r, g, b;
        unsigned char* rgbPixel = rgb;
        unsigned char* yuvPixel = yuv;
        unsigned char* uHeader = yuv + width * height;
        unsigned char* vHeader = yuv + width * height + (width * height) / 4;
        int half_width = width / 2;

        for (int j = 0; j < height; j++) {
            for (int i = 0; i < width; i++) {

                y = *yuvPixel;
                yuvPixel++;
                u = *(uHeader + (i / 2 + (j / 2 * half_width))); 
                v = *(vHeader + (i / 2 + (j / 2 * half_width)));

                // yuv to rgb, 整数、移位, 减少计算量
                r = y + ((360 * (v - 128)) >> 8);
                r = r > 255 ? 255 : (r < 0 ? 0 : r);
                *rgbPixel = r;
                rgbPixel++;

                g = y - (((88 * (u - 128) + 184 * (v - 128))) >> 8);
                g = g > 255 ? 255 : (g < 0 ? 0 : g);
                *rgbPixel = g;
                rgbPixel++;

                b = y + ((455 * (u - 128)) >> 8);
                b = b > 255 ? 255 : (b < 0 ? 0 : b);
                *rgbPixel = b;
                rgbPixel++;
            }
        }
    }
    void convert_yuv420sp_to_rgb_buffer(unsigned char* yuv, unsigned char* rgb, unsigned int width, unsigned int height)
    {
        int y, u, v;
        int r, g, b;
        unsigned char* rgbPixel = rgb;
        unsigned char* yuvPixel = yuv;
        unsigned char* uHeader = yuv + width * height;
        //unsigned char* vHeader = yuv + width * height + (width * height) / 4;
        int half_width = width / 2;

        for (int j = 0; j < height; j++) {
            for (int i = 0; i < width; i++) {

                y = *yuvPixel;
                yuvPixel++;
                u = *(uHeader + (i / 2 + (j / 2 * half_width)) * 2);  // 注意: 因为是整数乘除, 这里 (i / 2 * 2) 不一定都等于 i, 不要简化。
                v = *(uHeader + (i / 2 + (j / 2 * half_width)) * 2+1);

                // yuv to rgb, 整数、移位, 减少计算量
                r = y + ((360 * (v - 128)) >> 8);
                r = r > 255 ? 255 : (r < 0 ? 0 : r);
                *rgbPixel = r;
                rgbPixel++;

                g = y - (((88 * (u - 128) + 184 * (v - 128))) >> 8);
                g = g > 255 ? 255 : (g < 0 ? 0 : g);
                *rgbPixel = g;
                rgbPixel++;

                b = y + ((455 * (u - 128)) >> 8);
                b = b > 255 ? 255 : (b < 0 ? 0 : b);
                *rgbPixel = b;
                rgbPixel++;
            }
        }
    }
    void convert_yuyv_to_rgb_buffer(unsigned char* yuv, unsigned char* rgb, unsigned int width, unsigned int height)
    {
        unsigned int i;
        unsigned char* rgbPixel = rgb;
        unsigned char* yuvPixel = yuv;

        int y0, u, y1, v;
        int r, g, b;
        for (i = 0; i < width * height / 2; i++) {

            y0 = *yuvPixel;
            yuvPixel++;
            u = *yuvPixel;
            yuvPixel++;
            y1 = *yuvPixel;
            yuvPixel++;
            v = *yuvPixel;
            yuvPixel++;

            // yuv to rgb, 整数、移位, 减少计算量
            r = y0 + ((360 * (v - 128)) >> 8);
            r = r > 255 ? 255 : (r < 0 ? 0 : r);
            *rgbPixel = r;
            rgbPixel++;

            g = y0 - (((88 * (u - 128) + 184 * (v - 128))) >> 8);
            g = g > 255 ? 255 : (g < 0 ? 0 : g);
            *rgbPixel = g;
            rgbPixel++;

            b = y0 + ((455 * (u - 128)) >> 8);
            b = b > 255 ? 255 : (b < 0 ? 0 : b);
            *rgbPixel = b;
            rgbPixel++;


            // yuv to rgb, 整数、移位, 减少计算量
            r = y1 + ((360 * (v - 128)) >> 8);
            r = r > 255 ? 255 : (r < 0 ? 0 : r);
            *rgbPixel = r;
            rgbPixel++;

            g = y1 - (((88 * (u - 128) + 184 * (v - 128))) >> 8);
            g = g > 255 ? 255 : (g < 0 ? 0 : g);
            *rgbPixel = g;
            rgbPixel++;

            b = y1 + ((455 * (u - 128)) >> 8);
            b = b > 255 ? 255 : (b < 0 ? 0 : b);
            *rgbPixel = b;
            rgbPixel++;
        }
    }
点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Wesley13 Wesley13
4年前
java47
1.!(https://oscimg.oschina.net/oscnet/2c98b4302967887417c451b5f1868c56a56.png)1.List集合根据角标获取元素importjava.util.ArrayList;importjava.util.List;publicclass
Stella981 Stella981
4年前
Python Challenge Level 18
初学Python,挑战一下流行的PythonChallenge,很不幸,卡在了18关~~被字符字节码之间的转换搞得焦头烂额,不过终于搞定了还是很happy的~~~主要的问题就是16进制形式的字符如何转成字节码(注意:不是encoding)如:\'89','50','4e','47','0d','0a','1a','0a','00
Stella981 Stella981
4年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
Uber准备放弃自动驾驶,转手卖给前谷歌无人车CTO,估值曾被孙正义炒到72.5亿美元
!(https://oscimg.oschina.net/oscnet/0fe7cb00a0cf4872b022342d1e21d47e.png)杨净发自凹非寺量子位报道|公众号QbitAI最新消息,Uber要出售无人驾驶部门(ATG)了。据TechCrunch报道,Uber有意向出售,而也有人愿意买。
Wesley13 Wesley13
4年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
4年前
OpenCV调整彩色图像的饱和度和亮度
问题如何调整彩色图像的饱和度和亮度解决思路详细步骤:1.将RGB图像值归一化到\0,1\2.然后使用函数cvtColor进行色彩空间的转换3.接下来可以根据处理灰度图像对比度增强伽马变换或者线性变换调整饱和度和亮度分量4.最后转换到RGB色彩空间代码!/usr/bi
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这