广东工业大学 谢佳铭
为了实现单比特脉冲图像传感器的数据采集、实时演示、成像原理展示,设计基于MFC界面语言的成像演示系统。该系统使用ULM928测试盒采集图像传感器raw数据并传输到上位机。上位机可以设置图像传感器的触发阈值,测试盒的数据传输速度。同时,上位机还可以根据需要,实时重构当前场景、HDR图像合成、展示原始数据、高速场景捕捉等,也可保存原始数据以供后期需要进行高质量重构。演示结果表明,通过该成像演示系统,能够很好地展示脉冲序列图像传感器的成像原理,为后期进一步重构提供帮助。
近年来,图像传感器朝着高分辨率发展的同时,也对帧率提出了更高的要求,特别是在某些高速运动场景下如爆炸、风洞试验需要对物体运动细节信息做出详细的记录。以每像素8bit,每帧1280x720分辨率,每秒5000帧的图像传感器为例,其产生的传输需求达到36.86Gbit/s。这不仅对传输速率提出了极大的要求,也增加了传感器功耗。为了捕获高速场景运动信息,同时减少捕获过程中图像数据的冗余性,脉冲式触发输出的图像传感器被开发出来。但是由于高速脉冲图像传感器的像素数据输出是离散二进制格式,其后期的恢复重构方法还在探索中。目前,缺乏有效的重构算法,无法定制高效的硬件重构芯片,重构图像需要将原始数据采集到上位机进行重构验证,增加了许多不便。
为了方便采集原始数据,验证重构算法的正确性,帮助后期定制ISP,本文基于MFC界面设计语言,开发了脉冲序列图像传感器的数据采集重构系统。该系统需要满足的功能有:调节脉冲序列图像传感器参数、原始数据格式演示、实时重构当前场景、高时间分辨率细节展示。
该演示系统使用VS2015作为开发环境,使用Opencv3.3.0提供基础的图像处理函数功能。进一步地,该演示系统可以分为图像芯片参数配置模块、数据采集模块、数据展示模块、离线重构保存模块。
配置模块:传感器的最高传输帧率可以达到4万帧,最高数据量传输率可以达到40000x250x400/8=4Gbps/s,虽然USB3的最大传输输率可以达到5Gbps/s,但是注意到这个传输输率为理论值,因此为了避免数据丢包问题,我们将采集器的工作频率设置为20000帧,最大传输速率被压制到2Gbps/s。除此之外,演示系统还提供对传感器的工作电压设置,包括触发阈值,比较电压等。触发阈值可调范围为1.0-3.0V,通过调节触发阈值,能够调整比特的触发频率,譬如更好地适应暗光环境,但这样会增大暗电流等噪声的影响。打开演示界面,系统自动查找电脑上已接入的图像传感器,这一步是模仿传统的工业相机开发过程。系统查找到完整的相机列表之后,提供相机列表选择,并对列表里的第一个相机进行初始化。初始化包括预设传输帧率、工作电压、触发阈值等。采集过程中可以根据需要再次调整参数。参数设置模块如图1所示。
图1 参数设置区域
采集模块:初始化后,相机开始工作,传输数据。为了避免每一帧都进行传输,实际中的硬件采集部分会缓存一定的帧数再进行传输。本例所采用的缓存帧数为400帧,传输过程稳定时,程序每秒将传输50个数据包,每个数据包400x250x400bit=4.76Mbyte,每秒的传输速率将达到238Mbyte/s。因为数据量过大,因此传输得到的数据包将根据需要实时重构,或离线保存以供后期恢复时间分辨率更高的场景信息,否则将予以丢弃。
实时演示模块:为了拍摄感兴趣的场景,譬如抓拍某一个高速过程,需要对当前的数据情况有一个大概了解,因此需要以一个实时展示模块界面以提供实时场景展示。实时场景展示只需要提供对当前场景光强的近似拟合即可,对成像质量以及高速运动细节要求不高,因此采用简单的时间窗口计数即可。因为光强越强,像素触发1bit的频率越高,因此对一个数据包400帧里1的个数进行计数,将得到该像素的光强信息。另外,我们采用的展示图像格式为256级的灰度格式,我们还需要做溢出判断,以免计数个数溢出影响光强的恢复。
为了展示脉冲序列图像传感器的成像机理,我们需要展示传感器传输过来的raw数据,但是由于每一秒都有50个数据包传输过来,如果全部进行实时重构展示,系统每一秒将展示20000帧的原始帧,人眼无法观察到实际的细节变化,同时超出了显示器的帧率和系统负载的限制。因此,我们设置一个放慢倍数的倍数,选取1s内某一个小区间的数据,在5s的时间内进行展示,演示实际物体的运动细节。最终的整体演示效果如图2所示。
图2 整体演示界面
离线保存:当出现感兴趣的场景时,可以设置保存时间大小,将设定时间内的原始的数据包保留下来。相机的工作频率已经做了降频处理,每秒的传输输率达到了238Mbyte/s,这是因为计算机的固态硬盘能够提供峰值500Mb/s的读写,但由于计算机负载波动问题,时常无法达到这个写入要求。第二,每秒读写50个数据包,系统将在1s内进行50次系统调用,进一步降低了读写性能。上述原因导致了在实际的读取过程中出现了数据包丢失问题。数据包丢失问题对于静态场景和实时重构恢复需求场景的恢复效果影响轻微,但对需要恢复高速运动场景细节信息时,某一个时间段内一个数据包的丢失会造成数据包恢复切换时重构出来的帧有极大的错误。因此本例中,如果有保存原始数据的需要,我们将其缓存在内存里,等到设置时间间隔内的所有数据包都接收到后,才将数据包写在硬盘上。
离线重构模块:离线重构模块提供了两个基本的算法以针对不同恢复要求进行快速重构,并且提供逐帧保存功能。算法1是实时演示时使用的固定窗口计数功能,能够提供静态或相对低速的场景信息恢复。算法2针对高速运动细节恢复要求,使用1比特脉冲之间的间隔大小的倒数作为该间隔内的所有帧对应该像素的亮度值,该算法能够提供比固定窗口计数更好的时间分辨率。
多线程处理:由于成像演示系统每一秒都有50个数据包要处理,如果等到每一个数据包都处理完成,再处理下一个,那势必会造成数据包丢失及演示卡顿问题,特别是在有离线数据保存需要时,系统进行系统调用进一步增加了延迟时间。因此系统使用了多个线程对各个任务进行分解。最主要的几个线程可以分为数据采集线程,数据缓存线程,实时展示线程,成像原理展示线程,离线保存线程,离线重构线程。在这个过程中需要涉及到对数据的同步互斥读写。基本的线程关系如图3所示。最终实际拍摄以及上位机演示的实拍图如图4所示。
图3 线程关系逻辑图
图4 实际场景及上位机工作示意图
传统的图像传感器在遇到亮度变化幅度大的场景时往往会曝光过度或曝光不足,原因在于传感器芯片若非经过特殊阈值设计,其对光强的响应都是线性的,因此这样就造成了在有限的量化范围内无法记录亮度变化大的场景信息。脉冲式序列传感器对光强的响应也是近乎线性化,并未做特殊处理,所以在遇到亮度变化大的场景时,同样会出现图像对比度不佳的情况。增强图像对比度的方法有很多,比如直方图均衡,函数算子映射等,除此之外,HDR(高动态范围成像)也是一个提高图像动态范围,改善图像对比度的方法。传统的HDR成像可以分为软件和硬件两种方式,软件方法是将不同曝光时间的图像经过一组权重函数融合在一起,获得一张细节更加丰富的图像。在本例中,由于HDR合成融合的计算量比较大,无法实现实时性的展示,因此在实时展示环节,我们将图像原始帧的计数归一化,然后使用一些经典的Tone算子来提高图像的实时演示质量。经过Tone算子映射之后的图像效果对比如图5和图6所示。
图5 数据包简单恢复后的原始图
图6 经过简单tone算子提升后的对比图
针对不同的恢复要求,对数据的恢复方法不一样,从而对数据的保存连续性要求也不一样。当仅需实时展示场景信息,恢复低速运动细节时,倘若丢失一两个数据包,对成像的质量恢复影响并不大,其表现为丢失了0.02s的一个拍摄区间数据,未对实际的视频连贯性产生影响。但是当需要恢复高速运动细节信息时,由于脉冲间隔的信息将被用来恢复该区间内像素的光强,因此数据包丢失将造成在数据包切换时对应像素点的激发对应不上。这会造成图像恢复后出现大范围的白色斑点。因此,非常有必要保证系统对数据保存的容错性,在数据的采集中,要等到帧率稳定之后才能开始保存。除此之外,当保存数据时先将其缓存在内存里,而不是每接受到一个数据包都立刻进行系统调用保存在硬盘上。
本文简单介绍了脉冲图像传感器的成像模型,并基于原型机设计了一个成像演示系统,该演示系统能够很好地展示该传感器的成像原理,并完成原始的数据采集、保存、演示功能,提供了针对不同恢复要求的算法实现。采集得到的原始数据能够供给后期更精细的恢复要求使用,从而帮助定制与该种传感器匹配的图像信号处理器。