主题 : 新手第一帖,请教大牛为什么读不出摄像头的RGB数据 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 94232
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
综合积分: 6 分
注册时间: 2013-07-11
最后登录: 2017-09-13
楼主  发表于: 2013-07-13 21:13

 新手第一帖,请教大牛为什么读不出摄像头的RGB数据

最近购买了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值应该随着画面的变化而不断变化,请大牛们教我。
谢谢啦
级别: 总版主
UID: 45585
精华: 3
发帖: 628
金钱: 3375 两
威望: 675 点
综合积分: 1316 分
注册时间: 2011-05-06
最后登录: 2018-10-18
1楼  发表于: 2013-07-17 16:52
可参考 camtest.c 的示例代码,直接读到就是RGB了,无需转换
级别: 新手上路
UID: 94232
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
综合积分: 6 分
注册时间: 2013-07-11
最后登录: 2017-09-13
2楼  发表于: 2013-07-17 20:48
引用第1楼xoom于2013-07-17 16:52发表的  :
可参考 camtest.c 的示例代码,直接读到就是RGB了,无需转换

终于等到回复了,请问这个示例代码在哪里呢,不胜感激啊
我的邮箱是feili@tsinghua.org.cn
级别: 总版主
UID: 45585
精华: 3
发帖: 628
金钱: 3375 两
威望: 675 点
综合积分: 1316 分
注册时间: 2011-05-06
最后登录: 2018-10-18
3楼  发表于: 2013-07-22 11:36
光盘 Linux 目录下有一个 example.tgz