基于FPGA和ARM的红外图像实时显示和采集方法
2013-10-25隋修宝顾国华
毛 伟,隋修宝,陈 钱,顾国华
(南京理工大学电光学院404系,江苏南京210094)
1 引言
红外图像在军事和民用领域都有广泛的应用[1],随着科技的进步发展,红外图像的应用和处理要求越来越高,很多时候需要在不同平台上对红外图像进行传输、处理和显示。
FPGA(Field-Programmable Gate Array),即现场可编程门阵列,具有灵活性强,能够完成编程、修改和再编程操作的优点,同时它的开发周期短、风险小,因此被广泛的应用于数据处理和传输中。以ARM为核心的嵌入式系统具有设计方便灵活、功耗低、可裁剪和性价比高的优点,它长于事物管理,常被用来做界面及相关应用程序,因其在控制方面的优势,ARM被广泛地应用于各种终端设备的开发[2],但是由于主频低等因素的限制,在面对大量数据处理例如实时图像处理的时候,ARM总是显得难以完全达到要求,例如文献[3]所处理的红外视频处理就无法完全实时显示,同时还存在300ms的延时[3],文献[4]中使用重绘函数 Paint-Event()[4]函数实现图像显示的方法效率也不高等。这些缺点严重限制了它们在红外图像处理上的应用。
为克服上述缺点,本文以FriendlyArm公司的Tiny210ARM开发板为基础,采用所设计的方法实现了将大小为320×240的红外图像从FPGA传输到ARM开发板上,并实现了红外图像的实时处理(插值、伪彩色等)、显示和采集,提升了ARM在处理红外图像上的效率。本文主要分为三部分,第一部分介绍了图像数据从FPGA到ARM的传输,而全文重点在于第二、三部分介绍的图像接收、处理和显示,以及整个实验验证的结果。
2 网络图像数据传输
2.1 所用以太网协议及帧格式简介
开放系统互联(OSI)模型将网络通信工作分为了物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。本设计中主要涉及是前四层,物理层PHY使用的是Marvell公司的88E1111网络传输芯片;数据链路层使用的是Ethernet II帧封装包;网络层采用的是IP协议;传输层则是使用的是UDP(User Datagram Protocol)用户数据报协议。数据链路层的作用是完成图像数据的打包发送,是本设计的关键部分之一。
图1为Ethernet II帧格式,按顺序依次为前导码(Preamble),帧起始界定符(SFD),接收端的MAC地址DA,发送端的MAC地址SA,类型Type,发送的数据 Data,帧校验序列(FCS)[5]。
图1 Ethernet II帧格式Fig.1 Ethernet II frame format
2.2 数据封装的实现
数据链路层由两部分组成:上层的逻辑链路控制层(LLC)和下层的介质访问控制层(MAC)。MAC主要负责控制与连接物理层(PHY)的物理介质,将要发送的数据发送到PHY。由于当前大部分的ARM开发板所带的网卡都只能支持100Mbps,而我们所传输的是320×240面阵的红外图像,百兆网络的速度已经足够,故本论文仅讨论百兆网的网络传输,设计采用易于实现的RGM II接口,对应工作频率为25 MHz。
FPGA实现的MAC逻辑功能结构如图2所示,采集的图像数据经过量化处理后,首先进入SRAM,通过乒乓存储的方式缓存起来,然后再将图像数据读出来进行帧封装,为便于接收端更好的恢复图像数据,本设计在每一行数据之前加上了行号。图像数据加上了事先写在ROM里面的UDP包头、IP包头和Ethernet II帧头数据后被送入了循环冗余校验码(CRC)计算模块,CRC模块计算出每一帧的FCS值后再送入发送模块,与前面的帧头数据和图像数据连接在一起,送入PHY层发送出去。
图2 MAC逻辑功能结构Fig.2 The MAC logic functions structure
2.3 校验和的计算
在整个Ethernet II帧的头部和尾部,有三个校验和必须正确填充,否则就无法正确的传输。
IP包头的校验和是只计算IP首部的校验和,其计算方法是:首先把校验字段置为0,然后对首部中每个16位进行二进制反码求和,然后把结果存放检验的字段中。接收方在收到一个IP数据报后,同样对首部中每个16位进行二进制反码的求和,如果传输过程没有出错,计算结果应为全1,否则认为出错,将该数据报丢弃。
UDP的校验和是将首部和数据部分一起都检验,计算的时候需要引入伪首部,过程较为繁琐,但是这部分不是必须的,如果不用,只需将UDP的校验和字段的16位全部填入0即可。
FCS是在 CRC计算的基础上得到的,IEEE802.3规定参与FCS计算的数据是除了Ethernet II帧的前导码和帧起始界定符的其他数据。在本设计中,用的CRC_32生成多项式为:G(x)=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+1,串行CRC编码器原理如图3所示[6]。
由于以太网数据是低比特先传,而CRC核心电路是高比特先进,故在进行CRC计算之前,还要先对输入数据进行倒序,然后再传入CRC计算模块。对于CRC模块的输出数据,还要进行取反和与之前相同的位序变化操作后,才能得出最终的正确的 FCS[7]。
图3 CRC串行编码器Fig.3 CRC serial encoder
最终,通过Signal Tap II可以得到的数据报发送波形图,如图4、图5所示。图5是图4的局部放大图,其中,TX_EN为发送使能信号,直接送给PHY的TX_EN端口,fifoout[3:0]为发送数据,送给PHY的TXD[3:0]端口,25MOUT为发送时钟,送给PHY的GTX_CLK端口。
图5 数据发送波形图2Fig.5 Data transmission waveform 2
3 图像数据接收、处理和显示
3.1 接收平台和软件简介
本设计所使用的开发软件是Qt Creator,它是一款用于Qt开发的轻量级跨平台集成开发环境。它既可以开发GUI(Graphical User Interface)程式,也可用于开发非GUI程式,比如控制台工具和服务器。Qt可以开发基于Linux上的图形应用程序,这些图形应用程序可以顺利地移植到其他的操作系统上,也可以移植到嵌入式操作系统。
Tiny210是FriendlyArm公司研制和发售的一款高性能Cortex A8核心板,配备有一个分辨率为800×480的7寸LCD屏,它采用三星公司的S5PV210为主处理器,运行主频可达1GHZ,该处理器出色的性能使得Tiny210非常适合广告多媒体终端、智能家居、高端监控系统等设备。
3.2 UDP图像数据的接收、显示和采集
当ARM系统收到了网络图像数据的时候,数据的接收处理速度极大地影响了图像的显示效果,在早期的ARM系统上,由于ARM芯片的主频不够,处理速度较慢,在面对大量的数据处理的时候,总显得力不从心。随着ARM芯片性能的提升,其运行速度越来越快,功能也越来越健全,使得红外图像的处理能够在ARM上得以实施。但是,即使如此,要想在ARM上做实时图像显示仍然不是那么容易。很多时候,并不是ARM的处理速度不够,而是利用效率太低,当我们要处理的图像稍大的时候,ARM就不能做到实时。
FrameBuffer是一种驱动程序接口。这个设备的主要作用是供用户态进程实现直接写屏操作。该接口的工作机制是模仿显卡的功能,它将显卡硬件结构抽象掉,同时能够通过Framebuffer接口的读写直接对显存进行操作。我们可以将Framebuffer看成是显示内存的一个映像,将它映射到进程的地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上,我们将图像数据写进映射的内存中就能立即在屏幕上显示对应的图像。
多线程程序作为一种多任务、并发的工作方式,能够提高应用程序响应速度。这对图形界面的程序的意义尤其重要,当程序在进行一个操作耗时很长的任务时,整个系统在等待这个操作而无法响应鼠标、键盘、菜单等的操作,而我们使用多线程技术,将耗时长的操作置于一个新的线程,就可以避免这种情况,提高程序的效率。
因此,本文根据ARM在图像处理上的这些缺点,结合FrameBuffer和多线程的特点提出了一种新的图像接收处理和显示方式,其主要思想就是:通过增开GUI主线程以外的子线程来专门负责就收和处理图像数据,再通过FrameBuffer接口直接实现对液晶屏的写屏,将处理后的图像数据直接显示出来,这样在图像实时显示的问题上不用通过费时的Qt图像处理类来实现,使图像的显示和处理分开,大大的提高了显示的效率,能够很好的实现图像的实时显示。另一方面,GUI主线程则可以通过外接的中断按键很好的实现对图像显示的控制,例如图像保存、回放、冻结、参数修改和对前端的FPGA图像处理设备的控制等。具体实施过程如下。
在整个系统的前端,红外探测器所采集的红外图像数据每一个像素的灰度级都是被量化为14位的,为方便传输,在打包传输的时候在高位加零扩展为16位,每两行一个数据包,并且在数据包开头加上了每个包中第一行数据的行号,所以由FPGA发送过来的每一个UDP数据报的数据长度都是1282((320×2+1)×2)字节。用Qt进行UDP数据报的收发需要用到 QUdpSocket类,它继承自 QAbstractSocket[8]。这里的 Socket就是所谓的“套接字”,它是不同主机之间进行通信的端点,通过它就能实现网络上两台主机之间的双向通信。
Qt开辟子线程需要在所建的工程(ProcessImage.pro)中添加一个新的C++类,它的名字可随意(实验中命名为“UdpThread”),但是其基类必须是“QThread”且继承于“QObject”,然后再进入udpthread.h和udpthread.cpp进行编程操作,重新实现UdpThread::run()函数,再在主线程中添加“UdpThread”类的对象“thread”,调用 thread.start()函数来启动子线程,run()函数其部分代码如下:
子线程的工作流程图如图6所示,子线程来的主要任务就是监听接收网络端口的数据,按照主线程所给的指令对图像数据进行处理和显示。
图6 图像数据接收显示流程图Fig.6 Receiving and display flowchart of image data
主线程的主要工作是通过参数的修改和按键的作用对子线程工作进行控制,包括图像的处理、显示和保存。在我们需要看到目标的灰度图像或者伪彩色图像时,我们可以通过按键控制子线程改变图像处理方式,显示我们想看到的效果,而当我们想保存某一帧图像时,我们可以冻结图像的实时显示,并将当前缓存的图像以jpeg或者bmp格式存储至SD卡指定的文件夹,以供其他的应用。具体的实施方式如下:
在GUI主线程的构造函数中的部分代码如下:
本设计使用的ARM系统板有八个按键:K1-K8,打开“dev/buttons”就能获取每个按键的状态,即每次从它获取八个按键对应的八个字节,每个字节的最低位为1时,表示按键被按下,这样根据不同的按键被按下,程序可以做出不同的动作。ProcessImage::buttonclicked()函数部分代码如下:
memset(buffer,0,sizeof buffer);//初始化按键当前状态缓存
所以,我们想知道第i个按键是否被按下时,只需要判断isOn[i]是不是为1即可,编程时我们设定某个按键被按下后就改变响应的参数或发出指令,控制整个系统做出对应的动作。
在我们需要保存图像时,直接调用保存函数ProcessImage::Savepic()来完成图像的存储,其部分代码如下:
这样就能够将我们需要采集的图像存储到SD卡中,同时不会影响系统对红外图像的实时显示。主线程和子线程各司其职,相互配合的完成了红外图像的实时显示功能和图像采集功能,大大的提升了ARM的应用效率。
4 实验结果验证
图7所示是用抓包软件Wireshark所检测到的前端FPGA板所发送的红外图像UDP数据包速度。根据设计,所传图像的大小为320×240,帧频为25FPS,每两行一个数据包,故理论传输速率应为120×25=3000 Packets/s,故与图中显示的速率符合。整个系统的效果图如图8所示,由图可以看出,这个系统的总体相对较小,在结合合适的结构固定之后能够很方便的移动。图9所示为采用文献[4]所使用的图像重绘函数PaintEvent()实现图像的显示后的效果,该图大小为640×480,由于该函数在处理图像时效率不高,每帧图像处理不及时,在目标晃动时可以明显看出图像出现变形,同时有延时和丢帧现象的存在。而在同样的ARM系统上使用本设计的方法得到的红外图像如图10、11所示,这些图像同样是640×480,但是由这些实验结果图像可以看出,本设计完全可以实现红外图像的实时显示和图像保存且效果良好,没有出现变形、失真和丢帧的现象,这充分的说明了本设计技术的优异性,同时整个设计外形小巧,移动方便,能耗低,在结合蓄电池等设备的辅助下,可在很多复杂的环境下使用。
图7 数据包发送速率Fig.7 Packet transmission rate
图8 系统结构图Fig.8 System structure
图9 失真图像Fig.9 Distorted image
图10 本设计显示的灰度图像Fig.10 The gray image displayed in this design
图11 本设计显示的彩色图像Fig.11 The color image displayed in this design
5 结论
现今,红外图像的处理和应用范围越来越广,要求也越来越多,本设计通过采用结合Qt多线程编程和FrmageBuffer直接写屏的方式,在FPGA和ARM系统上高效的实现了红外图像的实时传输、显示、处理和采集,效果良好,且方法简便,技术完全可行,还能够在此基础上对红外图像进行进一步的开发和应用,同时整个系统体积较小,移动方便灵活,体现出了ARM和FPGA的结合在红外图像应用开发上的能力和优势,拓宽了红外图像的应用范围,具有一定的应用前景。
[1] Liu Hui,Zhao Wenjie,Wu wei.The military application of infrared imaging technology[J].Modern Science and Technology,2010,9(2):80 -82.(in Chinese)刘辉,赵文杰,吴畏.红外成像技术的军事应用[J].现代科技,2010,9(2):80 -82.
[2] Wu Hua,Xie Liying,Xu Zeyu.Design and implementation of thermal infrared camera based on ARM9[J].Computer Engineering,2010,36(16):234 -236.(in Chinese)吴华,谢礼莹,徐泽宇.基于ARM9的红外热像仪设计与实现[J].计算机工程,2010,36(16):234 -236.
[3] Li Ling,Pei Hailong.Design of infrared video processing system based on ARM[J].Video Engineering,2011,23(35):157 -160.(in Chinese)李玲,裴海龙.基于ARM的红外视频处理系统设计[J].电视技术,2011,23(35):157 -160.
[4] Shi Feng.Research of infrared image processing technology based on linux[D].Beijing:North China University of Technology,2009.(in Chinese)史峰.基于Linux的红外图像处理技术研究[D].北京:北方工业大学,2009.
[5] Chen Zhe,Gu Guohua.Data transmission of IR thermal imager based on gigabit ethernet[J].Laser & Infrared,2012,1(42):41 -44.(in Chinese)陈喆,顾国华.基于千兆以太网的红外热像仪数据传输[J].激光与红外,2012,1(42):41 -44.
[6] Liu Zhao,Su Li,Jin Depeng,et al.The parallel CRC codec design in the 10G ethernet system[J].Application of Electronic Technique,2004,30(4):47 - 50.(in Chinese)刘昭,苏厉,金德鹏,等.10G以太网系统中的并行CRC编解码器的设计[J].电子技术应用,2004,30(4):47-50.
[7] Tan Hua,Wei Lin,Tian Yijun.An achievement on FPGA of CRC -16 encoder with 32 bits parallel data[J].Journal of Hechi University,2008,2(28):74 - 79.(in Chinese)谭华,韦林,田宜君.32位并行数据的CRC-16编码器的 FPGA 实现[J].河池学院学报,2008,2(28):74-79.
[8] Huo Yafei.Qt creator quick start[M].Beijing:Beihang University Press,2012.(in Chinese)霍亚飞.Qt Creator快速入门[M].北京:北京航空航天大学出版社,2012.