冯 奇,毛 伟,黄涨国,马孟鸿,沈晓宇
在医院眼科及眼镜店中进行验光时,最后一步必定是主觉验光。最早是在纸上印视标,用荧光灯照亮,挂在被检者正前方5m处,由被检者观察大小、形状、指向不一的视标,进行眼屈光度的主觉检测。后来发展到投影视标,由投影机射出强光,照在投影板上,被照亮的各类符号通过投影镜头投射在专用幕布或反射板上。但是,这种视标仪具有大量的机械结构,存在对焦问题,且投影的视标符号与周围的明亮背景反差极小,一般明室视标对比度仅为2~10(与室内亮度有关),严重限制了反差测试能力,且使用寿命有限[1]。同时,普通红绿标的色饱和度不高,影响了观察的准确性。而且受光学原理所限,这类视标不能形成偏振投影,所以也不能形成优质的立体影像,不能对人眼的立体视觉进行检测,有一定的局限性。因此,开发高清的、能进行三维图像显示的视标仪在屈光检查中有重要的意义。这类视标仪清晰度高、反差大,可以形成立体影像,大大地提高了性能,拓展了应用范围。
由于该视标仪需要向高清显示器上输出高清图像,另一方面又需要对遥控器的指令做出实时反应,处理有关矢量图像,因而需要处理器有较高的处理速度,并且具有能够输出高清图像的数字接口——DVI-D或者HDMI接口。同时要求主机的功耗低、体积小,能装在一个很小的空间里,因此,可以考虑支持高清输出的ARM系统以及通用计算机主板。为了保证一定的视标生成速度、图像处理速度,考虑到软件系统的便利性,降低软硬件开发成本,提高开发速度,选择通用的、集成低功耗赛扬处理器的minithin iTX主板,主要用作视标仪软件系统,不涉及硬件控制部分。
该主板支持硬解1 080p MPEG-2、VC-1和H.264 3种高清视频,支持HDMI接口及DVI+VGA双接口,支持LVDS双八位数据通道,与3D高清显示器或面板连接简便;且整机功耗只有19~25W,适于作为视标仪的硬件平台。
为降低仪器成本,软件平台采用开源Linux系统,结合C++开发平台[2],作为整机的软件系统。因为二者都集成了大量实用的底层软件接口,所以开发者不用花费精力编制庞大复杂的应用软件系统。
为实现对视标系统及主机的遥控,另外单独设计遥控器、遥控信号接收解码及控制系统,用于各种遥控信号的解码,将之传递给主机产生各种动作,控制液晶面板背光的亮度,对主机进行开机、复位、待机、关机等操作。
遥控信号的解码采取单片机解码的方式。单片机解码控制系统采用自带USB接口及驱动的、混合信号MCU C8051F320[3],片内集成了数据采集和控制系统中常用的模拟部件、其他数字外设及USB接口部件,简化了USB技术的开发,缩短了开发周期。
该高清视标仪用遥控器完成所有操控,包括启动、复位、关机、若干种视标图像的生成计算以及调用、变换、显示等。
遥控面板的设计以最简操作为目标,基本操作都能一键完成,面板上分割为5个区域:
(1)视标选择:按下对应的按键,视标会依次切换成E标、C标、字母标、数字标、儿童标等。
(2)测试功能选择:包括红绿背景、反色、对比度选择、色盲图、立体视感(这里采用3D面板上安装的圆偏振片配合对应的3D偏振镜片的方法,立体感大大强于传统的红绿滤光片方法)、散光表散光轴位测试等。
(3)遮盖功能选择:包括单个视标的遮盖、水平的遮盖以及竖直的遮盖。在遮盖状态下,可通过上、下、左、右4个方向键来选择遮盖的区域;再次按下键则分别取消相应的遮盖。
(4)操作键:包括上、下、左、右的选择、确认以及对各图标进行缩放、旋转等。
(5)参数设置:包括选择视标的型号,根据距离远近及是否镜像,对所有的图标进行初始化,长按进入界面设置。
该设计采用NEC6122的键码编码协议[4],并选用HT6221芯片作为遥控器的红外发射编码芯片。其特点为:具有8位地址码、8位命令码以及它们的反码以提高可靠性;数据以脉冲时间长短调制;38 kHz载波频率,位时间1.12或2.25ms。
信号的开始由一段9ms、38 kHz的载波信号和4.5ms的关断时间构成。之后就是代码的逻辑“1”、“0”信号,分别占据2.25及1.12ms时长,每个信号起始均由560μs长的载波(约21个载波周期)脉冲加之后的关断所构成,如图1所示。如果一直按着某键,在正常的键码后则不断发送以110ms为周期的重复码,重复码由9ms的载波信号和4.5ms的关断及一个560μs的载波组成,如图2所示。
图1 NEC遥控信号格式(左前导码,右数据1和0的传输时序)
图2 NEC遥控信号重复格式
NB0038是一种用于红外遥控接收或其他方面的小型一体化接收头[5],中心频率为38.0 kHz,独立的PIN二极管同放大、滤波整形电路集成在同一封装上,可抑制自然光的反射干扰,防止无用脉冲输出。
该视标仪的硬件结构如图3所示。
图3 3D高清视标仪的基本结构
一体化红外接收头NB0038接收到遥控信号后,经内部放大、解调、整形后产生脉冲信号传至单片机的P0.0口,触发中断,单片机经解码之后得到正确的遥控键码,连同重复次数码作为一个数据包发给主机的USB口。主机从接到的USB信号中,得到相关的按键信息。主机USB缓存区的数据变化,作为槽脉冲触发主程序调用键码处理程序。单片机的P2.0端口用于检测主板的电源电压,当打开总电源之后主板得电,电源指示电压升高,将该电压引线连至单片机的P2.0端作为PW得电检测,单片机检测到这个信号之后在P2.1端口产生高电平,使三极管导通,拉低主板电源上电电压,使主机启动。为了防止主机在运行过程中意外死机,可以通过按下遥控器上的几个特殊组合键及长按键,经单片机识别之后,在P1.0口产生高电平,使主板的RST复位端产生低电平,从而重启主机。另外,还在视标仪的下部中心位置设置LED灯,长按遥控器可以启动该灯的亮灭。
主板上具有LVDS液晶显示接口,为降低干扰,提高图像的稳定性,可以直接通过LVDS屏线与3D显示面板的LVDS接口相联[6]。事实证明,这种连接方式最为直接,信号转换环节更少,显示效果要比DVI或HDMI接口更好。液晶显示面板LED背光的接口形式为BLE-6PINS-CCAACC,为四阴极结构,正好用LED背光芯片MAX16826来驱动。该芯片可以通过I2C接口,接收来自C8051f320单片机的硬件I2C串行总线数据,独立对4串LED灯的电流和电压进行控制,保证面板的亮度均匀性。一般不用PWM的占空比来调节屏幕亮度,而直接用I2C总线数据控制电流的办法调整屏幕亮度,以避免屏幕的闪烁。
完整的USB应用系统除了必要的硬件部分,还包括软件部分。软件部分分为3大块:在C8051F320设备上运行的固件程序、在主机上运行的USB设备驱动程序和主机视标仪应用程序。由于采用的是小数据量的键盘控制,将USB设备枚举成HID设备,这样无论是在Windows环境还是在Linux环境中,都无需为USB键盘设备安装驱动。主机应用程序通过USB接口与C8051F320通信,允许用户观察并改变C8051F320设备上的I/O外设的状态。当设备通过USB接口与主机连接好后,应用程序就开始枚举,并通过端点0、1和2来完成设备与主机之间的数据传输。在USB协议中,端点0数据包被定义为控制数据包,端点1和2分别用来输入数据和输出数据[7]。数据包用来回传解码之后的遥控键码,单片机向主机发回的数据包包括按键的键码以及长按键重复次数数据(短按则为0)以便主机做出判断。
遥控接收程序的流程如图4所示。
图4 遥控接收程序流程图
为节省开发与系统成本,该主机系统软件为基于开源的Linux系统,系统自带1 920×1 080的高清显示驱动程序。应用程序的开发平台为C++,完全面向对象,容易扩展,并且允许真正的组件编程。
整个应用软件实质上是不断读取遥控器上发来的键码,并采取相应的显示动作。为此目的,首先是制作相应的视标,如E字标、字母标、数字标以及相应的3D图标等,以SVG格式的矢量图形式存储在文件夹内。制作3D图标时,左右两眼看到的2幅图像各取奇数行和偶数行,交错存放,并分别通过液晶显示器偏振面板的左旋偏振和右旋偏振(这样左眼图像为左旋偏振光,右眼图像为右旋偏振光),再由受检者佩戴的圆偏振片分离出2幅图像[8]。整个程序由10个C++功能模块构成,其流程如图5所示,其中包括主程序(main.cpp)、颜色设置模块(colorsettingdialog.cpp)、距离设置模块(distancedialog.cpp)、图标设置模块(iconselectdialog.cpp)、语言设置模块(languagedialog.cpp)、键码读取及处理(keydialog.cpp)、镜像设置(mirrordialog.cpp)、视标显示及缩放模块(svg view.cpp)、用户选择模块(usertypedialog.cpp)、视力单位设置模块(VisusunitDialog.cpp)等(图5中惊叹号部分)。
在main.cpp主函数中包括:
fd=open(“/dev/remote”,O_RDWR);//打开红外遥控设备等实现系统的初始化及打开红外遥控功能
键码读取及处理(keydialog.cpp)用来读取遥控器发送过来的按键码,根据其短按、长按(结合长按重复码),调用相应的显示模块,进入到系统菜单等。其基本结构为:
图5 主机处理程序流程图
其中还包括:
视标显示及缩放模块(svgview.cpp)用来在进入视标显示状态下,对视标的缩放、旋转、切换、遮挡等操作。其函数包括:
SvgView::SvgView(Widget*parent):Graphics View(parent)
void SvgView::open File(const File&file)//打开视标文件
void SvgView::set Icon Scale(int viewpower)//根据视力值确定各个图标的缩放倍数
void SvgView::loadoptoset(int setnum)//装载各视标集的矢量文件等svgview类函数集
这2个部分是视标系统的主要部分,其代码占整个代码长度的90%以上。
距离设置模块(distancedialog.cpp)中包括:
Distance Dialog::Distance Dialog(Widget*parent):Dialog(parent);
此函数主要用作系统设置时的视标图像生成计算。某些检查环境由于受场地大小所限,并非都满足5m的标准检查条件,故在此输入检查距离即可对整个视标的大小重新计算,以满足等效的要求。此外,还包括镜像设置模块,以便受空间限制时,在镜像中观察视标。此模块设置完成后,在平时使用中不再调用。同时,在系统设置中,调用的模块还包括语言设置模块等。以上应用程序在C++环境下编译执行通过后,连同图标文件打包成一个可执行文件,放至系统根目录下开机自动执行。
按瑞利判据,人眼的最小分辨距离S=1.22λ/D×L。若以人最灵敏的光波长λ=550 nm、眼瞳直径的调节范围约为D=2~8mm计,在标准视力表距离5m处能分辨的最小距离为S=0.42~1.7mm。该3D高清液晶显示面板点距0.266mm、亮度250 cd/m2,均满足人眼分辨极限要求且符合纸质视力表的国标要求。将该视标仪与纸质标准视力表(按国标、后照法亮度大于200 cd/m2)、投影式视标仪、低分辨率液晶视标仪(1 280×1 024,点距 0.294mm,以下简称“低分视标仪”)在室内明亮进行实测对比实验,结果见表1。
表1 视力表实测结果
在同一环境、同一摄影曝光参数条件下对所摄4种视标的图像直方图如图6所示。
该视标仪在暗环境下的反差约为1∶23,在亮环境下的反差变为1∶16,与之对比,投影视标仪在暗环境下约为1∶7,但在亮环境下的反差严重恶化为1∶2。与表1相互印证,在低反差下,通过投影视标仪测得的视力要比标准值低。由对比分析可知,该视标仪的分辨率、反差及使用的方便程度等都优于投影视标仪,也不存在对焦精度的问题;像素点距优于低分视标仪,与国家制定的视力表标准较为接近,但又避免了纸质印刷的视力表的可记忆性、不可更改性、检查距离固定这一致命的缺点。同时又具备丰富的图标,适合各类人群、国别,具备散光轴、红蓝视标、立体测试等。因而该视标仪在众多的医疗机构、眼镜店内将得到越来越广泛的应用,并将取代另外几类视标仪。
图6 各视标仪在不同环境下的图像直方图
该设计采用低功耗的小型ITX主板,带3D圆偏振片的全高清液晶面板、一体化的红外接收头、单片机红外解码、控制系统,并采用完全遥控的方式,研制成功了具有3D立体视觉测试功能的高清视标仪,目前已做好整机模具,可批量生产。经实际使用,获得了比以往视标仪更好的性能和更灵活的使用,提升了视力检测的准确度。与此同时,该设计也可以采用主板与显示器分离的设计,将控制板、主板做成一台主机的形式,显示部分采用商品化的3D显示器,二者采用HDMI高清数据线相连接,这样便于用户选购,降低运输及维护成本。目前,国内市场上尚无高清视标仪,因此,本设计填补了这一空白。
在设计过程及最终成品的检测中,视标仪的图像质量评价是一个极其重要的因素,对检测的精度及准确度有着直接的影响。下一步的工作将围绕视标仪图像质量的评价展开,以期视标质量的规范统一。
[1] 刘建军.影响视力检测的因素[J].中国眼镜科技杂志,2005(7):46.
[2] 张玲.基于嵌入式Linux的图形界面的开发与研究[D].武汉:武汉理工大学,2012.
[3] 赵宏斌,全厚德.基于C8051F320的数据采集系统USB接口设计[J].微计算机信息,2009,25(9):91-93.
[4] 蔡明文.红外遥控通讯协议设计[J].长江大学学报:自然科学版理工卷,2008,5(4):173-175.
[5] 刘毅敏,史作锋.编码信息红外发射与接收器[J].微计算机信息,2007,23(5):92-93.
[6] 张涛,舒林锋,郑冬军,等.LVDS接口原理和标准及在平板显示系统中的应用[J].计算机与数字工程,2007,35(9):184-186.
[7] 王恒升,匡洋,彭宏道.USBHID类设备小驱动程序开发[J].控制工程,2010,17(11):815-819.
[8] 孙延禄.关于圆偏振光在3D立体影像显示中的应用——对《3D立体影像显示方法丛谈》的补充诠释[J].现代电影技术,2010(9):24-29.