1 总体方案
系统架构如图1所示,MT9M034采集HDR视频信号,FPGA负责对HDR视频图像进行增强处理,DM36X负责对增强后的HDR图像进行编码传输等处理。
系统3部分之间的数据流如图2所示。
图像传感器MT9M034经过配置后输出动态范围为120 dB的HDR图像。图像数据的位宽是20 bit,可选择性的压缩成12 bit或14 bit。由于DM36X处理能力的限制,在本系统中将传感器输出数据位宽设置为12 bit,这就会造成图像数据的损失。所以本方案在原IP Camera的基础之上添加了FPGA系统,可根据需要灵活增加底层的图像处理算法。首先图像传感器输出的视频数据在FPGA上进行捕获和对数压缩等处理,达到对图像增强的效果。然后再将这12位裸数据传输给DM36X系统,并在DM36X系统中完成色彩空间转换、伽马校正、RGB转YUV、边缘增强等一系列处理。最终将处理过的视频图像数据以H.264标准压缩后通过以太网接口传送到TCP/IP网络,完成用户通过远程PC机客户端上实时监控视频。
MT9M034(从设备)、FPGA(从设备)、DM36X(主设备)之间通过I2C总线进行通信。DM36X作为主设备不仅可通过I2C总线对MT9M034进行配置,还可对FPGA进行简单控制,如图3所示。
原DM36X IPNC的驱动程序是针对MT9T031传感器设计的。而本系统中采用的图像传感器是MT9M034。MTM034和MT9T031虽均是美光公司推出的图像传感器,寄存器位宽均为16 bit,但其寄存器编址位宽是有差别的,MT9T031传感器的寄存器编址是8 bit,而MT9M034传感器的寄存器编址是16 bit。为了使DM36X能对MT9M034传感器进行配置,需要对DM36X的驱动进行移植。
2 FPGA硬件电路设计
如图4所示,在FPGA上需要设计的电路包括图像捕获电路、数据校正电路、RAW转亮度电路、CLAHE色调映射电路和用于调试图像传感器的VGA显示电路。
DM36X将MT9M034配置好并启动后,图像传感器会输出12 bit的HDR图像数据,这些数据直接进入图像捕获电路模块,此模块主要是对数据进行标记和对行、列、帧等进行计算,为后面的电路设计提供必要的参数。MT9M034图像传感器通过分段性覆盖整个亮度域的3次曝光合成一副20 bit位宽的HDR图像,并将20 bit亮度分三段折线模拟对数压缩到12 bit输出,增加了传感器的实时性。因为普通的显示器只能显示8 bit数据,所以需要色调映射算法将HDR图像压缩成8 bit低动态范围图像(Low Dynamic Range Image,HDRI)这样既可保持图像整体明暗效果,又可使图像的细节部分很好的体现出来。由于传感器内部的三段线性压缩和标准的对数压缩曲线之间具有一定的差距,会使原HDR图像损失许多的细节信息,若直接进行色调映射算法的处理的话会影响图像的对比度,所以在进行色调映射之前需要进行对数据进行校正,最大程度上消除传感器三段线性压缩造成的误差,然后在进行对数压缩这样就可将整个图像的亮度压缩到一个较小的范围内,最后在通过色调映射算法实现图像效果的增强。由于时间原因在FPGA中仅实现图像的抓取电路,通过Nios2图像抓取电路向PC机中存入一帧图像用于图像效果的调试,其中抓取的图像每个像素位宽是12 bit裸数据,在Matlab中进行显示,如图5所示。
3 MT9M034驱动移植
3.1 传感器特性
MT9M034传感器是美光公司推出应用于安防领域的高动态范围图像传感器。该传感器具有全局运动补偿功能,最高可提供每秒45帧下1 280×960分辨率的视频拍摄,支持线性模式和高动态范围模式。传感器具有并行和串行差分两种数据输出接口。并行接口数据速率低,概念简单,便于实现,在本系统中采用并行接口,在后续开发中为了提高速度可考虑采用差分串行接口。
3.2 DM36X的I2C驱动移植
I2C(Inter-Integrated Cireuit)总线是由Philips公司开发的一种同步串行总线协议,其是一种多向控制线,可让多个芯片连接到同一总线结构上共同实施数据传输。DM36 X的I2C驱动架构如图6所示。
首先应用程序drv_i2c.c根据不同传感器的参数,将寄存器个数、寄存器地址位数寄存器值位数等配置信息存储在I2C_TRansferPrm结构中,其次通过I2C_IOCTL_CMD_MAKE()函数将这些具体的寄存器信息生成相应的命令。这些命令由ioctl()函数传递给内核空间中的设备驱动dev_i2c.c,在设备驱动程序中I2C_dev.Ioctl()函数对将对命令进行解析,根据不同的命令进行不同的操作,这里较为重要的两个命令是:(1)I2C_CMD_SET_DEV_ADDR,设置设备地址;(2)I2C_CMD_WRITE将用户空间的配置信息复制到内核空间,并存
储在I2C_TransferPrm结构中。最终通过I2C_write()、I2C_read()函数调用I2C_transfer()将数据发出。在I2C_write()、I2C_read()中都是以I2C_msg作为传输单元的。
struct I2C_msg {
_u16 addr;从设备地址
_u16 flags;标志位,区分读写等
_u16 len;消息单元长度
_u8 * buf;数据缓存,存储发送数据或者接收数据。
};
I2C_write()、I2C_read()函数的主要工作就是设置I2C_msg,将寄存器地址(regAddr)和寄存器值(regValue)写入I2C_msg的数据缓存buf中,并调用I2C_transfer进行数据传输,达到对传感器寄存器配置的目的。
根据以上分析可知,将I2C驱动移植到MT9M034上,只需修改应用程序drv_i2c.c和设备驱动程序dev_i2c.c即可,I2C_core及以下部分的内容属于内核部分,其接口都是统一针对Davinci平台下的,故无需进行分析和修改。由于MT9M034的寄存器是16 bit编址,故需增加16 bit寄存器读写函数DRV_i2cWrite16()、DRV_i2cRead16()。另外在I2C_Tra nsferPrm结构中增加16 bit寄存器地址指针;而且为了方便区分16 bit寄存器和8 bit寄存器,增加寄存器大小成员regSize。
在drv_i2c.c中增加I2C_write16()、I2C_read16()函数,这两个函数与I2C_write()、I2C_read()相似。只是在I2C_msg的数据缓存中存入regAddr[15:8]、regAddr[7:0]、regValue[15:8]、regValue[7:0],使I2C可读写16位数据。通过以上修改,I2C的驱动程序移植完成。
3.3 DM36X前端的驱动移植
I2C驱动移植完成后仅可使DM36X对图像传感器进行配置工作,为使DM36X成功接收来自传感器的视频数据,还需要对DM36X的视频处理前端(Video Processing Front End,VPFE)驱动进行相应的修改来添加新的传感器驱动程序。DM36X的DVSDK中已对VPFE驱动做了多次封装,将与图像传感器相关的代码隔离到了用户区,这样方便用户对源程序进行修改和移植,并根据不同的需要来添加已知型号的CMOS图像传感器驱动。通过对VPFE源程序的修改实现两个功能,一方面根据视频图像的分辨率和帧率等信息向DM36X驱动提供寄存器的配置信息,另一方面为MT9M034传感器提供以I2C为接口的控制和配置功能。
4 测试结果
确保硬件电路连接正确并上电后,将编译好的程序下载到DM36X中启动,打开远程PC机终端开启网页客户端或者VLC播放器输入用户名和密码,可显示1 280×720分辨率每秒30帧的视频图像,说明DM36X的驱动移植正确,并通过I2C总线将传感器配置成功。本系统的测试结果如图7所示,从图中可观察到在室内和室外光照强度相差较大的情况下,室内暗处和室外亮处的景物均可被观察到,具有较高的动态范围,保留了场景中绝大部分的细节,充分体现了本IP Camera的优势。
5 结束语
在安防领域,对于视频监控设备的要求不断的提高,本文是基于FPGA和DM36X联合硬件平台开发的一款高动态范围网络监控摄像机,通过对DM36X视频前端驱动的分析和移植,已完成DM36X对整个平台的控制工作,并实现1 280×720分辨率每秒30帧的实时播放。较传统的网络摄像机可更好地应对复杂光照场景,从而拍摄出较高动态范围的视频影像,使场景中更多的细节可被观察到,对于提高安防监控能力有着重要的意义。由于图像传感器输出的数据是由20 bit压缩到12 bit的,造成图像数据有一定的损失,对比度较低,为了弥补这些不足,在系统中添加了FPGA系统,由于时间关系FPGA部分只完成图像抓取电路的设计,后续的开发中将重点对其他模块进行硬件实现,完善整个图像采集处理系统。