摘要:高光谱图像数据量大,对数据传输带宽要求高,通常难以在结构紧凑的微型高光谱仪中实现实时调焦与视频流传输等功能。文中基于新型快照马赛克高光谱传图像感器,设计实现了一套嵌入式微型高光谱仪,在本地完成传感器的驱动和高光谱数据分离。单波段光谱图像数据经千兆以太网传输至上位机,从而大幅降低了对传输带宽的要求,大幅增强了调焦与光谱视频预览效果。实测结果显示,该系统高光谱图像传输帧频可达50帧/s,能够满足高时间分辨应用下的实时调焦与动态信息捕获的需求。
关键词:Zyny;微型高光谱仪;高光谱;图像传感器;光谱分离;实时
0 引言
高光谱成像技术能够同时获取被测物的光谱与图像信息,不仅可以对待测物体进行定性与定量分析,还可以定位分析,是光谱成像技术发展的一个重要方向[1-3]。但高光谱图像信息的获取意味着数据传输量的大幅增加,这必然要对成像系统数据带宽提出更高的要求。对于当前迅速发展的微型高光谱成像系统而言,受结构尺寸、性价比等因素限制,其数据采集与处理能力相对较弱,难以在结构紧凑的微型高光谱仪中实现实时调焦与视频预览等对数据带宽要求较高的功能[4-7]。
为了在多旋翼无人机载高光谱成像、现场高速机器视觉等对微型高光谱仪尺寸及重量有严格要求的场合获取高光谱图像,本文基于新型快照马赛克高光谱传感器(hyperspectral mosaic snapshot imager),设计并实现了一套嵌入式微型高光谱仪。该传感器通过在标准CMOS芯片感光面的每个像素上沉积特殊设计的马赛克块状滤光膜,形成25通道的光谱带,有望在极其紧凑的几何结构内以视频流的速度形成高光谱图像[8-11],从而克服传统光谱仪采集系统采用滤光片、线扫描等方式记录光谱信息时,需要庞大体积和很长采集时间的问题。目前,这一光谱成像技术已开始应用于多个领域,如农业、军事、遥感、环境检测、智能控制等[12-13]。
针对视频流及高光谱图像数据带宽要求高的问题,本文通过在嵌入式可扩展处理平台进行本地高光谱数据分离的方法,将25通道光谱数据进行分离,从而可在调焦与预览环节仅将容量为1/25的高光谱图像数据经千兆以太网接口传输至上位机,从而大幅降低了调焦与预览环节对传输带宽的要求。
1 系统方案及硬件结构设计
所设计的高光谱图像采集系统由微型高光谱仪、千兆以太网、上位机组成。其中高光谱微型光谱仪主要由高光谱图像传感器、可扩展处理平台Zynq、DDR3 SDRAM、千兆网接口组成。已设计完成的高光谱微型光谱仪实物图如图1所示。
图1 高光谱微型光谱仪实物图
微型高光谱仪的主控芯片为XC7Z020,属于可扩展平台Zynq系列。Zynq分为PL(programmable logic)和PS(processing system)2个部分,PL部分为大面阵FPGA,PS部分为2个ARM Cortex-A9核,性能十分强大。Zynq集成了ARM处理器的软件可编程性与FPGA的硬件可编程性,可实现硬件加速,同时还在单个器件上集成了CPU、DSP、ASSP以及混合信号功能。
本系统内存芯片采用2片型号为IS43TR16256AL-125KBLI的DDR3 SDRAM,容量为1 GB,能够提供足够的缓存空间,为高光谱大量数据采集与嵌入式本地光谱数据分离提供了可能性。DDR3相较于DDR2,功耗和发热量小,工作频率更高,通用性强。千兆以太网接口采用JFM3811F-FL01-4F接口,连接在Zynq的ENET0上。
系统采用的高光谱传感器在普通CMOS芯片感光面上镀有不同的光谱通带滤光膜如图2所示,芯片总像素大小为 2 048×1 088,每5×5个像素为1个单元,形成马赛克块状结构。单元中每个像素可通过的光谱波段各不相同,各单元之间完全相同,感光面共有25个光谱波段通道。
图2 芯片感光面示意图
快照马赛克高光谱传感器的数据输出采用的是LVDS(low voltage differential signaling,低电压差分信号)接口,LVDS可以很好地屏蔽干扰,提高信号传输时的稳定性和可靠性,LVDS要求在PCB布线时,信号线等长等距,如图3所示。
图3 LVDS布线
硬件电路采用12层高器件密度硬-软-硬PCB设计,连接2块硬板的软板弯折后可以节省很大空间,如图4所示。微型光谱仪外形尺寸为11 mm×6 mm×7 mm,小巧便携,增加了光谱仪的应用场景和适用范围。
图4 软硬板连接实物图
2 基于Zynq的高光谱数据采集
高光谱数据采集流程如图5所示。
图5 高光谱数据采集流程
Zynq需要为快照马赛克高光谱传感器提供驱动时序,配置正确的参数,然后从芯片图像数据输出通道接收数据。数据串并转换后通过DMA将其保存到DDR3 SDRAM中。
快照马赛克高光谱传感器输出16路数据信号,1路控制信号和1路时钟信号。Zynq给快照马赛克高光谱传感器提供时钟、电源、使能、帧请求、参数设置等信号。帧请求信号发出后,数据信号就会输出。FPGA中对数据传输、处理一般以单边沿时钟信号进行,Zynq接收到数据信号后先要将数据转换为单边沿数据。
像素采样深度为10 bit,以串行的方式从16路数据信号端口输出。Zynq需要对数据进行串并转换,将每个像素数据转换为并行数据便于后续处理和保存。由于数据是不断连续输出的,要根据控制通道的数据来判断哪一个bit是这个像素数据的第一个bit位。当快照马赛克高光谱传感器处于空闲状态时,16路数通道会输出固定校准数据,通过采集校准数据来校正每个通道。
16路数据通道默认校准数值为0x055,控制通道默认数值为0x200,需要用一个10位宽的寄存器变量存储串行输出数据,当接收够10 bit数时判断是否为校准数据,若不是则变量在采集下一个10 bit数时向后错开一位采集,这样依次错位采集直到采集的数值正好为校准数据,如图6所示。
图6 信号校准示意图
数据通道校准后,Zynq发出帧请求,16路数据通道开始输出数据。快照马赛克高光谱传感器像素为2 048×1 088,每个通道取连续的128个像素,16个通道同时工作,128个主时钟周期取完1行 2 048个像素。1个主时钟周期16个通道取16个像素,每个像素10 bit,共160 bit。DMA或DDR3 SDRAM传输数据是以32 bit为单位的,必须将160 bit数据切分为5个32 bit进行传输、存储。ARM通过对DMA IP核的控制将数据存储到DDR3 SDRAM中。快照马赛克高光谱传感器16通道工作示意图如图7所示。
图7 16通道工作示意图
3 光谱分离算法与实现
每一帧光谱图像数据大小为2.6 MB,若数据全部传输出去势必造成巨大的传输压力,导致上位机显示时就会出现卡顿不流畅的现象,无法完成实时调焦。在调焦或图像预览过程中,只需传输某一个光谱波段数据,不必获取全部波段光谱数据,可在嵌入式本地将各个波段的光谱数据进行分离后,传输单个通道的高光谱数据。Zynq的PL部分为PFGA,可实时处理光谱图像数据,处理速度完全可以满足本地光谱数据分离的需求。
首先需要将存储在DDR3 SDRAM中的完整光谱数据通过DMA取出来,然后通过一个32位宽的FIFO将数据传输给光谱分离模块,光谱分离模块将数据分离后又通过DMA将数据存储到DDR3 SDRAM中。用户需要查看某一个通道时,就连续实时取某一个波段光谱图像,需要查看全部波段光谱时,将完整的高光谱图像传输到上位机上。高光谱分离流程图如图8所示。
图8 高光谱分离流程图
以5×5型号的快照马赛克高光谱传感器为例,有25个波段,如图9所示,假设需要取第7个波段的光谱图像,根据掩膜板中通道的位置,计算出横纵坐标掩码值(mask_x、mask_y)。
图9 25通道掩膜板示意图
假想将掩膜板放置在图像上,原点开始,从左往右,从上至下依次移动掩膜板,每移动一次从掩膜板分离出阴影部分的数据,直至掩膜板遍历整幅图像。如图10所示,只分离出阴影部分的数据,然后形成一副新的图像,就是我们想要得到的第7个波段通道的光谱图像。
图10 高光谱分离原理示意图
高光谱分离模块的实现可分为3步,采用三级流水线技术,同步并行快速处理。
(1)等待FIFO不为空,数据准备完毕后高光谱分离模块从FIFO中取出5个32 bit数据,拼接为160 bit的数,就得到了快照马赛克高光谱传感器输出的16个原始像素数据。每取5个数,列标记(tag_x)加1,指向下一组数。列标记达到最大值后说明本行处理完毕,列标记归零同时行标记(tag_y)加1指向下一行。每行处理完毕后根据mask_y来判断,如果当前行包含有要分离的高光谱图像数据则令DMA使能标志位有效,DMA开始将处理后的数据回传至DDR中保存。核心代码如下:
if(s_tvalid&&s_tready)begin //准备完毕
if(cnt_five=4)begin //5个32 bit取完毕
cnt_five<=0;
if(tag_x==(px-1)) //一行数据分离完毕
tag_x<=0;
tag_y<=tag_y+1’b1; //针指向下一行。
if(tag_y%type==mask_y) //判断行有效
start<=1’bl: //使能
end
else
tag_x<=tag_x+1’bl;
end
else
cnt_five<=cnt_five+1’bl;
data_a=data_a>>32; //拼接5个32 bit
data_a[159∶128]=s_tdata;
end
(2)根据高光谱分离控制信号、横纵坐标掩码值,遍历取出的各个像素并分离出指定光谱波段数据并存储于存储器(band_data)中。核心代码如下:
//遍历160 bit中的16个像素
for(i=0;i<16;i=i+1)
//判断是否是指定光谱谐波段数据
if(((tag_x+px*i)%type)=mask_x)
//分离指定光谱波段数据
band_data[(tag_x+px*i)/type]<=data_a[(10*i+2)+:8]:
(3)将分离出来的数据通过DMA传输至DDR3 SDRAM中存储。由于行与行之间互相没有关联,且是按照顺序来的,当每行转换完毕后便将存储器中的数据送到DMA中。这样也可以减小PFGA中的存储器,节省大量的资源。首先判断DMA使能,然后每传输1个数,计数器(cnt_d2f)加1,当计数器达到最大值后表明此次传输完毕DMA使能信号置无效。因为DMA位宽为32 bit,所以需要将高光谱分离出来的数据拼接为32 bit。核心代码如下:
if(start)begin //DMA使能
if(cnt_d2f==(img_x/type/4-1)) //传输完毕
start <=0;
else begin
cnt_d2f<=cnt_d2f+1’bl;//计数器加一
//数据位宽整合为32 bit
m_tdata <= {band_data[cnt_d2f*4+3],
band_data[cnt_d2f*4+2],
band_data[cnt_d2f*4+1],
band_data[cnt_d2f*4]};
end
end
4 测试与分析
本系统Zynq中安装了linux操作系统,便于后续开发和维护。在linux系统中实现了BOA网络服务器(BOA webserver),用户可以通过任何安装有浏览器的终端访问光谱仪,并在浏览器中查看单通道光谱视频数据,或读取全波段高光谱图像。
在上位机的浏览器地址栏中输入微型高光谱仪的IP地址即可打开工作界面,如图11所示。右侧有2个按钮,用户通过单击第一个按钮来实时查看单波段光谱图像视频,单击第二个按钮获取一帧全波段光谱图像。
图11 浏览器查看光谱图像界面
图12、图13分别为对一个魔方所成的单通道光谱图像与全部波段光谱图像。
图12 魔方的单通道光谱图像
图13 魔方的全波段光谱图像
图14 高光谱分离前请求时间
利用Chrome浏览器上自带的调试工具可以查看每次请求1帧数据所需时间。上位机每次请求高光谱图像数据的时间间隔应大于光谱仪生成1帧高光谱图像数据实际使用时间,否则会出现错误,导致上位机出现图像显示不全等问题。
高光谱分离前上位机每次请求1帧数据所需时间为545 ms左右,如图14所示。为了保证请求过程中不出现错误,设置请求时间间隔为600 ms,帧率为1.67 FPS。
高光谱分离后上位机每次请求一帧数据所需时间为16 ms左右,如图15所示。为了保证请求过程中不出现错误,设置请求时间间隔为20 ms,帧率为50 FPS。
图15 高光谱分离后请求时间
通过高光谱分离前后帧率对比,可见高光谱分离后的帧率是分离前的大约30倍,帧率提升效果十分显著。在实测过程中,反复调节镜头焦距,浏览器中可实时观测到不同焦面的清晰图像,实现了动态调焦与视频预览。
5 结论
本文通过对嵌入式微型高光谱仪高光谱数据进行本地分离,获取单通道光谱图像,可实现动态调焦与实时光谱视频预览。高光谱数据分离由FPGA实现,相较于常用的软件处理方式效率更高,并减轻了系统处理器的负担。本文所实现的微型高光谱仪增强了高光谱图像实时显示效果,扩大了微型高光谱仪的适用场合,能够为普通消费者提供随时随地采集高光谱图像数据。