我觉得用USB的话,做摄像头采集算是比较高端的应用了,无论是对下位机,驱动还是上位机来说。事实上,因为我本身就是从事摄像头这个行业的,手上各种摄像头都有,又有OV的68013的Demo和度信的demo,于是闲暇并研究了下68013做USB摄像头的方法,搞了几个月,算是有点小心得吧,记录一下,给朋友们分享,也希望各位能一起讨论。 硬件搭配上可以是单个68013(也是我目前正在弄的,我后面说的也是基于这个讨论的),或68013+CPLD,或68013+FPGA,当然,用FPGA然后配合SRAM或0204电话录音FIFO芯片肯定是几种硬件中速度最高的;
固件就是基于FX2/FX2LP的了,基本上就用Cypress现成的固件架构,采用FX2或directdrawFX2LP都可以,其实要自己写的代码很少,不超过50行;
驱动的话,有两种选择,EZUSB或CYUSB,这就牵扯到你固件PID/VID和上位机软件实现了,当然,我这里说的是直接试用Cypressofp002的驱动,你自己写驱动的话就无所谓了;
最后是上位机,如果是采用ezusb驱动,那么上位机就是用GPD+Win api写的了,相对烦
琐点,我更喜欢的是用cyusb,上位机用cyapi实现,方便多了,而且测试的时候可以用cyconsole而不是control pane(个人不喜欢用control pane)。
【2】硬件电路,固件的实现
先说固件,我们知道,对于摄像头来说,采集速度肯定越高越好,68013两种高速采集的模式: SlaveFIFO(我目前正在做的)
GPIF
GPIF--我就不说了,弄的比较少,不太熟,而且一般来说是应用与模拟其他通信的,就以我目前做的SlaveFIFO来说说好了,以后的话可能再用GPIF实现吧。
SlaveFIFO--两种方法:主要对sensor的VSYNC信号,VSYNC接68013 PA0引脚,HREF接SLWR,采用查询或中断方式。
查询:上位机中在数据采集线程里每次采集前发Vendor命令,固件收到后循环查询PA0也就是VSYNC信号的到来,一旦到来,立即清空FIFO,然后返回上位机开始采集数据,以此来实现帧同步。
中断:硬件种SLWR接一与门,PA0设置为中断0,HREF与一IO口相与然后接SLWR。上位机发Vendor命令,固件vendor种与门禁止,并清FIFO,开中断;一旦VSYNC到来,产生中断,在中断中使能与门,实现帧同步。这种方法的好处就是相比查询来说错帧的几率小。
【3】上位机的实现(基于VC6.0)
相对来说,如果在固件里我们只需要写不到50行代码,那么在上位机里就可能写超过1000行的代码,可见用68013进行CMOS摄像头的采集主要工作在上位机编程。
搜索了网上所有的实现方法,大概有以下三种:
GDI(已经实现)
Directdraw(正在研究中)
Directshow
GDI--实现应该是最简单的了,不过缺点就是占CPU,就我写的那个程序,开起来占C
PU 40%多;速度嘛,只能说一般;更严重的是GDI只能针对RGB数据,而一般来说目前摄像头用的最普遍的是raw data或YUV格式(具体的说就是YUV422),必须得转换成RGB才行。
Directdraw--为了解决用GDI显示YUV必须先软件转RGB的问题,网上搜了下,发现ddraw可以直接YUV写屏,可惜,搜遍百度,就只到那么一篇帖子,还是YUV420的,试了下,发现不行;于是开始学习ddraw,买了本Windows 游戏编程大师技巧看了一阵子,对ddraw有些了解了;再可惜,我把代码放在MFC里就不行了,目前痛苦中,正在研究如何在MFC下使用窗口模式directdraw。期待ddraw的高速硬件YUV写屏能力及低CPU占用。 Directshow--我的终极目标就是用directshow实现。其实,我最先就是开始研究directshow的,不过那时是用个手机摄像头来显示的,也就是桌面USB视频,可以直接显示UVC的。个人觉得,好处就是,directshow因为是专门的一套多媒体库,在ddshow里可以直接截取帧,设置彩,调,亮度,制式帧率等,而不用像在GDI和Ddraw里那样得自己编程用软件实现,做一堆复杂的工作;不过,可惜啊,貌似如果不做成UVC的话,是要自己写Filter的,才能识别自己的非标准USB视频设备--可惜本人还不会写Filter家谱管理系统。
【4】最终整个系统要达到的要求
固件:发现度信的Demo最高速度就是500W sensor 1~2fps(yuv),最近公司从韩国买的一套demoalysa_queen可以达到7~10fps(yuv),不过是PCIE接口的(3000$,王宝连真TM贵!)。不知道如果采用68013+FPGA+SRAM/FIFO的话可不可以将速度提升到7fps以上,还是说必须要等到USB3.0的到来?
上位机:1--实时显示采集帧率
2--自动识别sensor
3--热插拔
4--窗口(640×480),全屏支持
5--自动识别数据格式(RawBayer ,RGB555,RGB565,YUYV,YVYU,UYUV,VYUY等)
6--调焦算法
7--污点,坏点检测
8--AF,ZOOM控制