搞不定了,不得不发帖求助了!——OV2640 200W 摄像头驱动问题

gooogleman 2009-06-30 05:17:09
平台 2440 wince6.0

其实这个驱动是4.2BSP下的,我直接搬上来用了。

是比较简单的那种,是单层的。

初始化代码太多了,我就不发了,我发个图片上来让大家提供点思路。
问题一、摄像头中断产生正常,踩到的图像是一片绿色,在摄像头前面放置任何物体也不会变化颜色。不知道怎么回事

问题二、同样的摄像头初始化代码,我无意间改了一些东西(我也不记得是2440的那个寄存器了),显示出了
条纹,并且放置物体上去会有明显的变化,这说明摄像头对外界有反应了。

但是到了这步我真的不知道怎么做了,胡乱改是行不通的,请问大家有什么摄像头开发方面的资料参考一下。多谢指点。
...全文
2784 67 打赏 收藏 转发到动态 举报
写回复
用AI写文章
67 条回复
切换为时间正序
请发表友善的回复…
发表回复
zwtchy123 2011-10-21
  • 打赏
  • 举报
回复
uping
zhoubingzhang4539 2011-08-17
  • 打赏
  • 举报
回复
不好意思,我不会传图片,但是我想说的是30万的拍出来的图片比你的还要清晰,所以,应该是还没有调整好焦距的原因。
zhoubingzhang4539 2011-08-17
  • 打赏
  • 举报
回复
楼主你好,你后来调通的图像有沙粒状的东西,应该不是可以对硬件摄像头的焦距进行下修改,就是转下摄像头的螺丝,在每一组摄像头的寄存器配置后,都会有一个最佳的焦距,你试着调一下,我传一个30万像素摄像头的图片你看看。最近在调130万的摄像头OV9650,但是一直找不到标准的寄存器配置,所以出来的图片效果很不好。不知楼主有没有
XLG561 2010-10-20
  • 打赏
  • 举报
回复
看完,顶一下~~~~~~
gooogleman 2010-08-10
  • 打赏
  • 举报
回复
[Quote=引用 62 楼 hnxxsdp 的回复:]
您好,gooogleman!
我现在在用STM32的开发板连接OV2640调试,也可以出图像了,但图像和你上面的图一样,有很多像沙子一样的噪点。不知道你的问题最后解决了没有?分享一下吧,呵呵
[/Quote]

这个后来我也不懂怎么解决了。呵呵。
hnxxsdp 2010-08-09
  • 打赏
  • 举报
回复
您好,gooogleman!
我现在在用STM32的开发板连接OV2640调试,也可以出图像了,但图像和你上面的图一样,有很多像沙子一样的噪点。不知道你的问题最后解决了没有?分享一下吧,呵呵
smart_qiang 2010-08-01
  • 打赏
  • 举报
回复
要学习到,标记一下。。。。。。。。。。。
gooogleman 2009-07-07
  • 打赏
  • 举报
回复
本来以为今天可以开展调试显示问题了,

但是我发现了个严重的错误,我把Display_Cam_Image放错地方了,
我改正后,放到
if (cam_intr == BIT_SUB_CAM_P)
{
RETAILMSG(1, (TEXT(" Camera interrupt.....BIT_SUB_CAM_P\r\n")));
Display_Cam_Image(0,0, 240, 240, PORT_A);// 2009.07.07
//Buffer_preview_info_update();
}

居然信息不打印,了,图像也不显示了,
这个说明P通道中断(用来显示图像的)根本没有产生中断,所以以前显示条纹很正常了。哎,真是可怜人哦。
这个程序是根据OV9650 修改而来, 也是能打开的,没有想到居然会这样子,真是不知道为什么了。
gooogleman 2009-07-07
  • 打赏
  • 举报
回复
再传个图像,好像图像被锐化一样,嘿嘿,明天FAE过来看看
gooogleman 2009-07-07
  • 打赏
  • 举报
回复
发个好点的正常位置看看吧。
gooogleman 2009-07-07
  • 打赏
  • 举报
回复
[Quote=引用 57 楼 jinlking 的回复:]
应用程序是基于DShow写的吧
像素差 要改变Capture filter的配置
[/Quote]

DShow 改善不大的,我看过别人的,也是直接显示在LCD上的,非常清晰。
现在我位置校正了,下次找FAE来配置寄存器就可以了。

哈哈,总算完成任务了。
jinlking 2009-07-07
  • 打赏
  • 举报
回复
应用程序是基于DShow写的吧
像素差 要改变Capture filter的配置
gooogleman 2009-07-07
  • 打赏
  • 举报
回复
嘿嘿,终于出图像了,不过200W摄像头的图像,效果比130W的OV9652 还要差。不知道怎么回事呢。真晕啊。
汗死我了。
大家帮我看看是什么原因,对于这方面的经验,实在是太少了。
daigua04 2009-07-06
  • 打赏
  • 举报
回复
请教jinlking,
我的camera驱动导出函数中,
EXPORTS
DllMain
CAM_Init
CAM_Deinit
CAM_Open
CAM_Close
CAM_IOControl
PIN_Init
PIN_Deinit
PIN_Open
PIN_Close
PIN_IOControl

CAM_IOControl函数中有IOCTL_CS_PROPERTY的分支,这个是wince6.0下的camera驱动吧?我的应用环境是wince5.0,还需要两个驱动(CAM和PIN)吗?PIN驱动是干什么的呢?
jinlking 2009-07-06
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 daigua04 的回复:]
请问google man,我的摄像头驱动导出函数中为什么会有PIN_Init等函数,不是CAM_Init就可以了吗?请问PIN是指什么呢?
[/Quote]
个人觉得 wince6 摄像头实际上就是两个驱动CAm 和Pin,在6410下做过类似的工作,2440还没有,刚查了Display_Cam_Image这个函数在6410下没有。
gooogleman 2009-07-06
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 daigua04 的回复:]
请问google man,我的摄像头驱动导出函数中为什么会有PIN_Init等函数,不是CAM_Init就可以了吗?请问PIN是指什么呢?
[/Quote]

PIN还是CAM完全是自己随便写的,没有实际意义。只要和注册表对应即可。

daigua04 2009-07-06
  • 打赏
  • 举报
回复
请问google man,我的摄像头驱动导出函数中为什么会有PIN_Init等函数,不是CAM_Init就可以了吗?请问PIN是指什么呢?
dontium 2009-07-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xumercury 的回复:]
寄存器值需要修改下。。行场同步的特别要关注。
[/Quote]

此为正解!!
摄像头的图像和你放入显示存中的图像的行与场要一致
daigua04 2009-07-06
  • 打赏
  • 举报
回复
jinlking、clementzhao英雄,不好意思借用googleman的地盘,我新建了个帖子,恳请光临,http://topic.csdn.net/u/20090706/17/0e663687-8903-406d-8654-2b5d06505f79.html?3062,有分的!呵呵!
gooogleman 2009-07-06
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 gooogleman 的回复:]
在这里我想问个弱智问题
————————————————————————————
LCD怎么填上八位的图像数据就可以显示了? ——搞错了ScreenBitmap是十六位的
memcpy((void *)IMAGE_FRAMEBUFFER_UA_BASE, ScreenBitmap, LCD_ARRAY_SIZE_TFT_16BIT);
这个LCD是16位的RGB565格式啊,对这个不了解。


我的图像是直接拷贝到LCD 显示的,和上面的原理相同! ——这里明白了,是把RGB565 分成两个bit,如果是三个bit就浪费了
memcpy((void *)(IMAGE_FRAMEBUFFER_UA_BASE+ (240*2*pos_y + pos_x*2) + y*240*2),
(void *)buffer_rgb,
(size_x*2));



C/C++ code
// 在这个函数里面,把RGB分为四帧来传送。为什么会是四帧呢?还有,这是RGB565的LCD,怎么一次性传送八位而已呢
void Display_Cam_Image(U32 pos_x, U32 pos_y, U32 size_x, U32 size_y, U8 port)
{
U8 *buffer_rgb;//这是RGB565的LCD,怎么一次性传送八位而已呢——这里理解错了,这样定义代表这个数据以一字节来访问

U32 y;
int temp;

//unsigned short *ptr = (unsigned short *)(FRAMEBUF_BASE+0x5dc0);

static unsigned short transfer_data[QCIF_XSIZE*QCIF_YSIZE];
static unsigned int time,old_time;

RETAILMSG(1,(_T("Display_Cam_Image()\r\n")));

//if (port)
{
temp = (s2440CAM->rCIPRSTATUS>>26)&3;//Preview path status
temp = (temp + 2) % 4;

switch (temp)
{
case 0:
buffer_rgb = (U8 *)s2440CAM->rCIPRCLRSA1;//RGB 1st frame start address for preview DMA
break;
case 1:
buffer_rgb = (U8 *)s2440CAM->rCIPRCLRSA2;//RGB 2nd frame start address for preview DMA
break;
case 2:
buffer_rgb = (U8 *)s2440CAM->rCIPRCLRSA3;//
break;
case 3:
buffer_rgb = (U8 *)s2440CAM->rCIPRCLRSA4;//RGB 4th frame start address for preview DMA
break;
default :
buffer_rgb = (U8 *)s2440CAM->rCIPRCLRSA1;
break;
}
}
//四个frame start address 是轮流使用的,从后面显示可以看出来,每个地址存放两个RGB565 数据
RETAILMSG(1,(_T("preview buf index = %d\r\n"), temp));

#if (DOTNET_DRIVER)
SetKMode(TRUE);
#endif

RETAILMSG(1,(_T("preview buf index = %x\r\n"), buffer_rgb));
buffer_rgb += VIRTUAL_OFFSET;
RETAILMSG(1,(_T("preview buf index = %x\r\n"), buffer_rgb));
// time = GetTickCount();
// RETAILMSG(1,(TEXT("+:%d\r\n"),(time - old_time)));


#if 1
for (y=0;y<(size_y-2);y++) //rgb format
{
//memcpy((void *)(FRAMEBUF_BASE+0x5e00+y*240*2),(void *)buffer_rgb,(QCIF_XSIZE)*2);
//memcpy((void *)(FRAMEBUF_BASE+ (240*pos_y + pos_x) + y*240*2),(void *)buffer_rgb,(QCIF_XSIZE)*2);

//our LCD vbuff is xsize = 480 ysize = 320 QCIF_XSIZE = 240
//copy one line
//RETAILMSG(1,(_T("IMAGE_FRAMEBUFFER_UA_BASE(1)\r\n")));
//void *memcpy( void *dest, const void *src, size_t count );
//Display_Cam_Image(0,0, 240, 240, PORT_A);
memcpy((void *)(IMAGE_FRAMEBUFFER_UA_BASE+ (240*2*pos_y + pos_x*2) + y*240*2),
(void *)buffer_rgb,
(size_x*2));
//RETAILMSG(1,(_T("IMAGE_FRAMEBUFFER_UA_BASE(2)\r\n")));
//跳到图像的下一行开始指针
buffer_rgb += (QCIF_XSIZE*2);
}
#endif

#if (DOTNET_DRIVER)
SetKMode(FALSE);
#endif

old_time = GetTickCount();
//RETAILMSG(1,(TEXT("-:%d\r\n"),(old_time - time)));

}

[/Quote]

哎,理解这些数据格式了。现在感觉,俺的C语言就是一个字,菜!
加载更多回复(47)

19,503

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧