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);
}