YUYV转RGB

YUYV是YUV的一种一个像素占用两个字节,存放顺序为[Y0 U0][Y1 V0][Y2 U1][Y3 V1].....

Y表示亮度,UV是色差信号奇数(在前)和偶数(在后)像素共用色差信号UV

下面是用查表法转换YUYV(YUV422)为RGB32位的代码

int y_table[256];//查表法
int v_r_table[256];
int v_g_table[256];
int u_g_table[256];
int u_b_table[256];

unsigned int limit_table[256*3];

__forceinline unsigned int LimitToUnsigned8Bits(int value)
{
    if (value > 255)
        return 255;
    else if (value < 0)
        return 0;
    else
        return value;
}

void InitTable()
{
    for(int i=0;i<=255;i++)
    {
        y_table[i]=(i-16)*1192;
        v_r_table[i]=(i-128)*1634;
        v_g_table[i]=(i-128)*833;
        u_g_table[i]=(i-128)*401;
        u_b_table[i]=(i-128)*2065;
    }
    for (int i=0;i<256*3;i++)
    {
        limit_table[i]=LimitToUnsigned8Bits(i-256);
    }

}

__forceinline unsigned int ConvertYUVPixelToRGB(unsigned char yComponent,unsigned char uComponent,unsigned char vComponent)
{    //转换公式
    /*
    B= 1.164*(Y-16) + 2.018*(U-128);      为了提高速度,放大后使用整数计算,同时移位10位相当于放大缩小1024倍
    G= 1.164*(Y-16) - 0.380*(U-128) - 0.813*(V-128);
    R= 1.164*(Y-16) + 1.159*(V-128);
    */

    //原版代码
    //int y = yComponent - 16;
    //int u = uComponent - 128;
    //int v = vComponent - 128;
    //int r = LimitToUnsigned8Bits((1192 * y + 1634 * v) >> 10);
    //int g = LimitToUnsigned8Bits((1192 * y- 833 * v - 401 * u) >> 10);
    //int b = LimitToUnsigned8Bits((1192 * y + 2065 * u) >> 10);
    //return (255 << 24) | (r << 16) | (g << 8) | b;

    int y1192=y_table[yComponent];
    int r = limit_table[((y1192 + v_r_table[vComponent]) >> 10)+256];//可能小于0,先取正
    int g = limit_table[((y1192 - v_g_table[vComponent] - u_g_table[uComponent]) >> 10)+256];
    int b = limit_table[((y1192 + u_b_table[uComponent]) >> 10)+256];

    return (255 << 24) | (r << 16) | (g << 8) | b;
}

void ConvertBitmapFromYUYV(int width, int height, unsigned char *bufferIn,unsigned int *bufferOut)
{
    for (int pixel = 0; pixel < width * height; pixel += 2)
    {
        unsigned char y1 = *bufferIn++;
        unsigned char u = *bufferIn++;
        unsigned char y2 = *bufferIn++;
        unsigned char v = *bufferIn++;
        //unsigned int a=ConvertYUVPixelToRGB(y1, u, v);
        *bufferOut++ = ConvertYUVPixelToRGB(y1, u, v);
        *bufferOut++ = ConvertYUVPixelToRGB(y2, u, v);

    }
}

YUYV转RGB

时间: 2024-10-11 20:38:43

YUYV转RGB的相关文章

摄像头v4l2编写,实现视频在帧缓冲显示

申明:该文档只是记录我的编写和理解过程,代码部分参考了较多的文章,如有意见请联系我删除,谢谢. 目标: 使用v4l2提供API,完成摄像头视频采集,并使用帧缓存显示. 准备工作: USB摄像头1个 编译环境(我用的是PC+Ubuntu14.04) 了解大概情况,查看如下网址,基本情况应该没问题了:http://baike.baidu.com/item/V4L2?sefr=enterbtn 框架理解: 关键点理解: 摄像头采集的循环buf 必须使用循环buf,否则摄像头采集图像显示不会连续. 摄像

C语言高级应用---操作linux下V4L2摄像头应用程序

我们都知道,想要驱动linux下的摄像头,其实很简单,照着V4L2的手册一步步来写,很快就可以写出来,但是在写之前我们要注意改变系统的一些配置,使系统支持framebuffer,在dev下产生fb0这样的节点,这样我们才能在linux系统上操作Camera摄像头,framebuffer在之前的博文已经有说过了,这里就不再提了. 有需要了解framebuffer的那么请点击:http://baike.baidu.com/view/3351639.htm 最重要的,我们需要改一个脚本,在/dev/g

v4l2视频采集摄像头

v4l2 --是Linux内核中关于视频设备的内核驱动框架,为上层访问底层的视频设备提供了统一的接口./dev/vidioX 1.打开设备文件 fd=open("/dev/video3",O_RDWR); /dev/video3:视频设备文件名 O_RDWR:可读可写 fd: open成功反返回文件描述符 jpeg yuv 2.查询设备支持哪种格式 struct v4l2_fmtdesc fmt; //查询设备格式所用结构体 fmt.type = V4L2_BUF_TYPE_VIDEO

乐学成语项目的实现

首先给软件取名为HappyIdiom,在开始编码之前,需要先对程序进行需求分析,想一想HappyIdiom中应该具备哪些功能.将这些功能全部整理出来之后,我们才好动手一一实现.这里我认为HappyIdiom中至少应该具备以下功能: 1.成语分类学习:你可以根据自己喜欢的分类(动物类.人物类.季节类.自然类.数字类.语言类.其他类)来进行学习. 2.乐猜成语:学习之余玩玩猜成语游戏,寓教于乐. 3.成语收藏:当用户遇到自己想要保存的成语,点击保存按钮,即保存到收藏页面以方便用户再次查看,对已经掌握

YUYV格式到RGB格式的转换

为什么YUYV格式要转到RGB格式,视频的显示调用的多数API都是基于RGB格式,所以需要进行格式的转换. YUYV格式如下: Y0U0Y1V0 Y2U1Y3V1.......... 说明:一个Y代表一个像素,而一个Y和UV组合起来构成一个像素,所以第0个像素Y0和第一个像素Y1都是共用第0个像素的U0和V0.而每个分量Y,U,V都是占用一个字节的存储空间.所以Y0U0Y1V0相当于两个像素,占用了4个字节的存储空间,平均一个像素占用两个字节. RGB格式: R0G0B0 R1G1B1.....

谈谈“色彩空间表示方法”——RGB、YUY2、YUYV、YVYU、UYVY、AYUV

转自:http://bbs.chinavideo.org/viewthread.php?tid=4143 还可参考http://www.fourcc.org/yuv.php 小知识:RGB与YUV----摘自<DirectShow实务精选> 作者:陆其明 计算机彩色显示器显示色彩的原理与彩色电视机一样,都是采用R(Red).G(Green).B(Blue)相加混色的原理:通过发射出三种不同强度的电子束,使屏幕内侧覆盖的红.绿.蓝磷光材料发光而产生色彩.这种色彩的表示方法称为RGB色彩空间表示(

MATLAB读取一张RGB图片转成YUV格式

1.读入照片 控制输出的标志定义 clc;close all;clear YES = 1; NO = 0; %YES表示输出该文件,请用户配置 yuv444_out_txt = 1; yuv444_out_yuv = 0; yuv422_out_txt = 0; yuv422_out_yuv = 0; yuv420_out_txt = 0; yuv420_out_yuv = 1; filename = 'Koala.jpg'; filestr = filename(1:findstr(filen

RGB和YUV之比较 (转)

http://blog.csdn.net/qfnu08zzr/article/details/6763159 RGB 原理 RGB 是从颜色发光的原理来设计定的,通俗点说它的颜色混合方式就好像有红.绿.蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于两者亮度之总和(两盏灯的亮度嘛!),越混合亮度越高,即加法混合. 有色光可被无色光冲淡并变亮.如蓝色光与白光相遇,结果是产生更加明亮的浅蓝色光.知道它的混合原理后,在软件中设定颜色就容易理解了. 红.绿.蓝三盏灯的叠加情况,中心三色最亮的叠

图像处理之基础---yuv420及其rgb,bayer, yuv, RGB的相互转换详解

YUV格式解析1(播放器——project2) 根据板卡api设计实现yuv420格式的视频播放器 打开*.mp4;*.264类型的文件,实现其播放. 使用的视频格式是YUV420格式 YUV格式通常有两大类:打包(packed)格式和平面(planar)格式.前者将YUV分量存放在同一个数组中,通常是几个相邻的像素组 成一个宏像素(macro-pixel):而后者使用三个数组分开存放YUV三个分量,就像是一个三维平面一样.表2.3中的YUY2到Y211都是打包 格式,而IF09到YVU9都是平