首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

s3c2440的c通路yuv转rgb

2012-12-26 
s3c2440的c通道yuv转rgb大手给看看这个用r0 1402*(cr0-128)/1000+y0;g0 (- 344*(cb0-128) - 714*(cr0-

s3c2440的c通道yuv转rgb

大手给看看这个用r0 = 1402*(cr0-128)/1000+y0;g0 = (- 344*(cb0-128) - 714*(cr0-128))/1000+y0;b0 = 1772*(cb0-128)/1000+y0;转换完得到的实时图像,这是什么原因引起的?
[最优解释]
=(1<<11);

rgb_data0 = 0;
#endif

    #if CAM_CODEC_OUTPUT==CAM_CCIR420
for (y=0;y<size_y;y++) // YCbCr 4:2:0 format
{
for (x=0;x<size_x;x+=2)
{
rgb_data0 = Conv_YCbCr_Rgb(*buffer_y++, *buffer_y++,        *buffer_cb++, *buffer_cr++);
LCD_BUFFER_CAM[y][x/2] = rgb_data0;
}
}
#else
//for (y=0;y<size_y;y+=2) // YCbCr 4:2:2 format
   for (y=0;y<size_y;y++) // YCbCr 4:2:2 format
{
//for (x=0;x<size_x;x+=2)
   for (x=0;x<size_x;x++)

//U16 lt;
//Uart_Printf("\n x %d y %d " ,x,y);
//                                            Uart_Printf("\ny0 %x cb %x cr %x " ,buffer_y,buffer_cb,buffer_cr);
//                                        rgb_data1 = Conv_YCbCr_Rgb(*buffer_y++, *buffer_y++, *buffer_cb++, *buffer_cr++);  //2012-11-06
//rgb_data0 = Conv_YCbCr_Rgb(*buffer_y++, *buffer_y++, *buffer_cb++, *buffer_cr++);

 rgb_data0 = Conv_YCbCr_Rgb(*buffer_y, *(buffer_y+1), *buffer_cb, *buffer_cr);
 buffer_y++;
if(x%2){
 buffer_cb++;
 buffer_cr++;

           LCD_BUFFER_CAM[y][x]     = rgb_data0;//2012-11-01 
// LCD_BUFFER_CAM[y+1][x+1] = rgb_data1;

//LCD_BUFFER_CAM[y][x/2+1] = rgb_data0>>16;

}

U32 Conv_YCbCr_Rgb(U8 y0, U8 y1, U8 cb0, U8 cr0)
{
int r0, g0, b0;
U32 rgb0;
r0 = (1000*y0 + 1371*(cr0-128))/1000;
g0 = (1000*y0 - 336*(cb0-128) - 714*(cr0-128))/1000;
b0 = (1000*y0 + 1732*(cb0-128))/1000;
#endif

if (r0>255 ) r0 = 255;
if (r0<0) r0 = 0;
if (g0>255 ) g0 = 255;
if (g0<0) g0 = 0;
if (b0>255 ) b0 = 255;
if (b0<0) b0 = 0;
rgb0 = (((U16)r0>>3)<<11) 
[其他解释]
 (((U16)g0>>2)<<5) 
[其他解释]
1.yuv有n多种格式
 采样: 4:4:4   4:2:2 4:2:0 4:1:1 
 排列:YVYU UYVY YV12 打包 等务必确定原始的数组是什么样的格式
   yuv色彩空间: https://zh.wikipedia.org/zh/YUV
2.rbg 也有N多种 ;24位 16色 32色 等


3. LED可能只支持某些rbg格式

我之前有过是 yuyv格式的原始数据(摄像头) 转化成为 RBG24位.
最好是早某一点(4点) 按位(字节)查看,一次找出 y u v的值,看颜色对不对,再找出转换后的值,再对比颜色是否正确.
[其他解释]
= (1<<11);
rGPGDAT &= ~(1<<11);
Delay(90);
rGPGDAT 
[其他解释]
自己先顶一个!兄弟姐妹们给看看!
[其他解释]
cr0,cb0为什么要减128?
[其他解释]
我配置的lcd的16位显示,比例是4:2:2的,dma把我摄像头9650的数据存储到了ram,我用摄像头的中断读出来转换成rgb的数据显示的!

void Display_Cam_Image(U32 size_x, U32 size_y)
{
volatile U8 *buffer_y, *buffer_cb, *buffer_cr;
volatile U8 y0,y1,cb0,cr0;
volatile int r0,r1,g0,g1,b0,b1;
volatile U32 rgb_data0, rgb_data1; 
U32 x, y;
int temp;

if (CAM_CODEC_4PP)
temp = (((rCICOSTATUS>>26)&0x3)+4-2)%4; // current frame memory block
else
temp = 4;
//Uart_Printf("Current Frame memory %d\n", temp);

switch (temp) // current frame mem - 2
{
case 0:
buffer_y  = (U8 *)rCICOYSA1;
buffer_cb = (U8 *)rCICOCBSA1;
buffer_cr = (U8 *)rCICOCRSA1;
break;
case 1:
buffer_y  = (U8 *)rCICOYSA2;
buffer_cb = (U8 *)rCICOCBSA2;
buffer_cr = (U8 *)rCICOCRSA2;
break;
case 2:
buffer_y  = (U8 *)rCICOYSA3;
buffer_cb = (U8 *)rCICOCBSA3;
buffer_cr = (U8 *)rCICOCRSA3;
break;
case 3:
buffer_y  = (U8 *)rCICOYSA4;
buffer_cb = (U8 *)rCICOCBSA4;
buffer_cr = (U8 *)rCICOCRSA4;
break;
default :
buffer_y  = (U8 *)rCICOYSA1;
buffer_cb = (U8 *)rCICOCBSA1;
buffer_cr = (U8 *)rCICOCRSA1;
break;
}
         #if 0
            // for fing converting time 
rGPGCON = (rGPGCON&~(1<<23))
[其他解释]
(1<<22); //EINT19 -> GPG11 output
rGPGUP 
[其他解释]
 (((U16)b0>>3)<<0);return(rgb0);
}


[其他解释]

这个我应该就是去掉一半的色度信息吧,人眼对亮度比对色度敏感!
[其他解释]
9650配置输出422还是420?
[其他解释]
好吧,我以前做过的是 原始数据yuv的,lcd只支持rgb16的.还和排列的顺序有关.
建议弄张纯色的图片试试,先确定到底在那个环节出错了.
尽量想办法屏蔽掉其他环节的影响.打印一下每个步骤的某几个像素的值(RGB YUV)才好判断.
引用:
我配置的lcd的16位显示,比例是4:2:2的,dma把我摄像头9650的数据存储到了ram,我用摄像头的中断读出来转换成rgb的数据显示的!C# code?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585……

热点排行