最近购买了mini2440配套的摄像头,基于OV9650,130万像素。
接上板子后,摄像头工作很正常。
由于做的课题是采集视频中的一帧图像,对图像进行分析,因此需要把RGB数据读出来。
看了一段时间代码,自我感觉有些明白,但是将数据输出时却发现输出的RGB数据全是固定值。
下面这段是Code代码转换为RGB的语句
U32 Conv_YCbCr_Rgb(U8 y0, U8 y1, U8 cb0, U8 cr0) // second solution... by junon
{
int r0, g0, b0, r1, g1, b1;
U32 rgb0, rgb1, rgb;
#if 1 // 4 frames/s @192MHz, 12MHz ; 6 frames/s @450MHz, 12MHz
r0 = YCbCrtoR(y0, cb0, cr0);
g0 = YCbCrtoG(y0, cb0, cr0);
b0 = YCbCrtoB(y0, cb0, cr0);
r1 = YCbCrtoR(y1, cb0, cr0);
g1 = YCbCrtoG(y1, cb0, cr0);
b1 = YCbCrtoB(y1, cb0, cr0);
#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;
if (r1>255 ) r1 = 255;
if (r1<0) r1 = 0;
if (g1>255 ) g1 = 255;
if (g1<0) g1 = 0;
if (b1>255 ) b1 = 255;
if (b1<0) b1 = 0;
// 5:6:5 16bit format
rgb0 = (((U16)r0>>3)<<11) | (((U16)g0>>2)<<5) | (((U16)b0>>3)<<0); //RGB565.
rgb1 = (((U16)r1>>3)<<11) | (((U16)g1>>2)<<5) | (((U16)b1>>3)<<0); //RGB565.
rgb = (rgb1<<16) | rgb0;
return(rgb);
}
下面这段是将RGB数据输出:
void Display_Cam_Image(U32 size_x, U32 size_y)
{
U8 *buffer_y, *buffer_cb, *buffer_cr;
U8 y0,y1,cb0,cr0;
int r0,r1,g0,g1,b0,b1;
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;
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 checking converting time
rGPGCON = (rGPGCON&~(1<<23))|(1<<22); //EINT19 -> GPG11 output
rGPGUP |= (1<<11);
rGPGDAT &= ~(1<<11);
Delay(90);
rGPGDAT |=(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++);
frameBuffer16BitTft240320[y][x/2] = rgb_data0;
if ( (x==(size_x-2)) && ((y%2)==0) ) // when x is last pixel & y is even number
{
buffer_cb -= size_x/2;
buffer_cr -= size_x/2;
}
}
}
#else
for (y=0;y<size_y;y++) // YCbCr 4:2:2 format
{
for (x=0;x<size_x;x+=2)
{
rgb_data0 = Conv_YCbCr_Rgb(*buffer_y++, *buffer_y++, *buffer_cb++, *buffer_cr++);
// U16 lt;
//Uart_Printf("%x,%x\n", *buffer_cb, *buffer_cr);
//测试只输出Y(亮度)
// lt = (*buffer_y++)>>3;
// rgb_data0 = ((lt<<11)|(lt<<5)|(lt))<<16; //1st pixel
// lt = (*buffer_y++)>>3;
// rgb_data0 |= (lt<<11)|(lt<<5)|(lt); //2nd pixel
//测试只输出U
// lt = (*buffer_cb)>>3;
// rgb_data0 = ((lt<<11)|(lt<<5)|(lt))<<16; //1st pixel
// lt = (*buffer_cb++)>>3;
// rgb_data0 |= (lt<<11)|(lt<<5)|(lt); //2nd pixel
//测试只输出V
// lt = (*buffer_cr)>>3;
// rgb_data0 = ((lt<<11)|(lt<<5)|(lt))<<16; //1st pixel
// lt = (*buffer_cr++)>>3;
// rgb_data0 |= (lt<<11)|(lt<<5)|(lt); //2nd pixel
//测试ov9650固定输出U=0x1f,V=0x70的模式
// rgb_data0 = *buffer_y++<<24; //1st pixel
// rgb_data0 |= *buffer_cb++<<16;
// rgb_data0 |= *buffer_y++<<8; //2nd pixel
// rgb_data0 |= *buffer_cr++;
// rgb_data0 &= ~0xff00f800;
// rgb_data0 |= 0x0700;
//测试ov9650输出RGB565格式
// rgb_data0 = *buffer_y++<<24; //1st pixel
// rgb_data0 |= *buffer_cb++<<16;
// rgb_data0 |= *buffer_y++<<8; //2nd pixel
// rgb_data0 |= *buffer_cr++;
//RGB高低交换
// rgb_data0 = *buffer_cb++<<24; //1st pixel
// rgb_data0 |= *buffer_y++<<16;
// rgb_data0 |= *buffer_cr++<<8; //2nd pixel
// rgb_data0 |= *buffer_y++;
// rgb_data0 &= 0xf800f800; //red only
// rgb_data0 &= 0x07e007e0; //green only
// rgb_data0 &= 0x001f001f; //blue only
LCD_BUFFER_CAM[y][x/2] = rgb_data0;
Uart_Printf("%08x\n", rgb_data0);
}
}
#endif
#if 0
rGPGDAT &= ~(1<<11);
Delay(30);
rGPGDAT |=(1<<11);
rGPGCON = (rGPGCON&~(1<<22))|(1<<23); // GPG11 output -> EINT19
#endif
}
输出到串口的数据全是固定值:0420420,不知是什么原因,RGB值应该随着画面的变化而不断变化,请大牛们教我。
谢谢啦