用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 编辑过」