您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> 请教:BF592 CMOS_2 示例代码,摄像头采集图... 
本帖共有995个阅读者
发表帖子 发表投票 回复主题
请教:BF592 CMOS_2 示例代码,摄像头采集图像格式
bh99(论坛新手)
bh99
头衔:社区公民
帮派:无帮无派
帖数:25
金钱:337
积分:41
注册时间:2012/4/24
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
请教:BF592 CMOS_2 示例代码,摄像头采集图像格式

用ImageViewer看image_buf,选了几种格式,144*176大小,看不到正确的图像。选灰度图,图像好像小了充不满144*176,图像还重复。

程序自身lcd显示的除了效果差点(可能是物距太近)外,看起来是正确的灰度图。

下面这些配置不明白,不知道摄像头存到image_buf里面的是什么格式的数据。

void   Video_Frame_Capture(void)
{

    image_buf = (unsigned char*)malloc(25344);//25344=176*144,说明采集到的图像是每个像素一个字节?
    if(image_buf == NULL)
        return 0;
    *pPPI_FRAME = 176;          
    *pPPI_COUNT = 287;//这里含义是每个像素2个字节的数据吗?   
    *pPPI_DELAY = 88;
    *pPPI_CONTROL = 0x01AC;
    *pDMA0_START_ADDR = image_buf;    
    *pDMA0_X_COUNT = 144;//上面是287,这里每次x_modify是1,那传完所有数据了吗?
    *pDMA0_X_MODIFY = 0x1;            
    *pDMA0_Y_COUNT = 176;    
    *pDMA0_Y_MODIFY = 0x1;                                                
    *pDMA0_PERIPHERAL_MAP = 0x0;            
    *pDMA0_CONFIG =  WNR | WDSIZE_8| DMA2D  | DI_EN;  //WDSIZE_8,是没有pack,就是dma传输时是按字节传输,而不是每个时钟16位? 那一行是传了144字节呢,还是288字节?
    *pDMA0_CONFIG |= DMAEN;
    ssync();
    *pPPI_CONTROL |= PORT_EN;
    ssync();                
}

EX_INTERRUPT_HANDLER(DMA0_PPI_ISR)
{    
    int i,j;
    unsigned char tem;
    *pDMA0_IRQ_STATUS = 0x1;  
    *pPPI_CONTROL &= 0xfffe;
        ssync();
       *pDMA0_CONFIG &= ~DMAEN;
    ssync();    
    for(j=0;j<176;j++)  
    {
        for(i=0;i<144;i++)       // 这两个循环,说明显示是144*176吧,采集到的图像也应该是144*176
        {
            tem = image_buf[i+j*144];   //从这里看,每行还是144字节啊,tem是亮度值吧,那就是说没有UV分量,就是说采集到的是灰度图像了?ov9650 datasheet 没看到有灰度图像输出啊?
            line_data[2*i+1] = tem&0xf8;  //这几句,是不是说RGB565都取tem的高5位或6位啊?
            line_data[2*i+1] |= (tem>>5)&0x07;    
            line_data[2*i] = (tem<<3)&0xe0;
              line_data[2*i] |= (tem>>3)&0x1f;    
        }
           Write_pic(j,line_data);
    }
   free(image_buf);
    
   Video_Frame_Capture();                      
  
}

难道这种配置方法,能够自动舍弃UV分量,只保留Y分量?

    *pPPI_COUNT = 287;
    *pDMA0_X_COUNT = 144;
    *pDMA0_X_MODIFY = 0x1;


新手,想移植一个不知道型号的摄像头过来,531开发板的示例貌似明白了点,592上的又迷糊了,还望andy能详细解释一下,不胜感激!



「该帖子被 bh99 在 2013-01-17 01:18:33 编辑过」

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/1/17 1:06:35
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

//25344=176*144,说明采集到的图像是每个像素一个字节?
是,每个像素只采Y。

//这里含义是每个像素2个字节的数据吗?

表示PPI每一行采集288次。每次采1个字节。

  *pDMA0_START_ADDR = image_buf;    
    *pDMA0_X_COUNT = 144;//上面是287,这里每次x_modify是1,那传完所有数据了吗?
    表示DMA只传输144次,只传输Y数据。

*pDMA0_X_MODIFY = 0x1;            
    *pDMA0_Y_COUNT = 176;    
    *pDMA0_Y_MODIFY = 0x1;                                                
    *pDMA0_PERIPHERAL_MAP = 0x0;            
    *pDMA0_CONFIG =  WNR | WDSIZE_8| DMA2D  | DI_EN;  //WDSIZE_8,是没有pack,就是dma传输时是按字节传输,而不是每个时钟16位? 那一行是传了144字节呢,还是288字节? /

一行传144个,DMA会自动舍弃色度数据。
DMA在8Bit宽地采集时,会自动舍掉色度信息,如果想采集彩色图像,必须将DMA配置为16bit,所以这里配置的DMA为8bit,而X修改和Y修改都为1,看上去貌似连续采集,但实际上采集到的有效数据为隔一个采集一个。

   // 这两个循环,说明显示是144*176吧,采集到的图像也应该是144*176
采集到的为144*176灰度图像。

//从这里看,每行还是144字节啊,tem是亮度值吧,那就是说没有UV分量,就是说采集到的是灰度图像了?ov9650 datasheet 没看到有灰度图像输出啊?
YUV模式的数据格式为 YUYVYUYV,Y就是亮度数据,UV为色度数据。DMA在采集时已经舍去色度数据,只取了Y,并非OV9650配置为灰度图。

//这几句,是不是说RGB565都取tem的高5位或6位啊?
是,8位灰度图转RGB,将8位灰度数据的高位填入每个RGB的数据即可。

难道这种配置方法,能够自动舍弃UV分量,只保留Y分量?

对,在DMA采集时,采用8bit模式已经舍去了UV数据。







这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/1/17 19:01:28
bh99(论坛新手)
bh99
头衔:社区公民
帮派:无帮无派
帖数:25
金钱:337
积分:41
注册时间:2012/4/24
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

Andy回复得太详细了,眼泪哗哗的......


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/1/18 1:09:58
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159184 Call, 1 Queries, Processed in 0.015625 second(s),