吴祝清,李冬秀,陈 望
(1.桂林优利特医疗电子有限公司,广西桂林 541004;2.桂林医学院附属医院,广西桂林 541001;3.桂林英美特生物技术研究所,广西桂林 541004)
在医疗检验全自动体液分析流水线系统[1]中,检验人员将已放置人体体液(如人体血液、尿液样本)采样试管的试管架手动放入流水线进样托盘中,进样托盘依次将试管架推送到传送带上后,首要工作就是采集试管架及其架位的信息,包括试管架条码、试管架位有无试管、试管条码、试管样本颜色、试管样本类型、试管样本浊度、试管样本液位高度等,以便流水线系统对该试管架内的人体体液样本进行后续的测试规划。
当前试管架位样本信息采集的主流方式皆为采用不同的功能模块进行组合来实现。例如,在试管架侧面用射频仪或红外扫描实现试管架条码读取;利用红外对射光耦实现试管架中有无试管检测;用条码仪实现试管架中试管条码读取;通过光线照射液体时的散射光强度来测定试管样本浑浊度。但基本没有试管液位高度检测。这种采用单功能独立模块组合方式来实现不同信息的采集增加了仪器开发成本和安装调试难度,不利于仪器的小型轻量化,更不利于仪器的可靠性以及后续维护,而且采集的信息难以进行统一的管理和分析。
随着机器视觉的兴起,陆秦江[2]提出采用图像处理技术,对试管进行识别及信息采集,但其硬件主体采用PC与图像采集卡组合的方式,不便于进行集成式安装。在此基础上,为实现集成化、小型化及智能化,本文以ARM9芯片[2-4]NXP i.MX280为核心板,搭载CMOS摄像头,设计一款嵌入式试管架位信息采集模块。
试管架位信息采集模块总体设计包括硬件设计与软件设计。硬件设计主要实现试管架位图像采集,为软件提供运算及数据存储,对外提供通信交互电气接口以及外围控制电路;软件设计主要包括软件编译环境搭建与移植、软件逻辑功能设计、软件识别算法设计。
整个模块由ARM9核心板、CMOS摄像头、玻璃面板、相关通信接口以及铝壳体组成,硬件组成框图如图1所示。ARM9核心板以NXP i.MX280为主控芯片,其内核为ARM926EJ,主频为454 MHz,板载64 MiB DDR2同步动态随机存取内存(synchronous dynamicrandom-accessmemory,SDRAM)以及128 MiB NandFlash存储器。CMOS摄像头配置的成像镜头工作焦距为4.9 mm,视场角度为72°,光学畸变≤-1.0%,可确保所获图像基本为平场无畸变;采用通用工业USB 2.0电气接口,可以实现1 080P图像采集速度为30帧/s,同时配备由外部控制的LED补光灯电路。本模块还包含1个扬声器、1个RS232串口、1个控制器局域网络(controller area network,CAN)总线接口、1个RJ45网口(如图2所示)以及必要的电源指示灯。
图1 试管架位信息采集模块硬件组成框图
图2 试管架位信息采集模块RJ45网口电气接口原理图
本模块外形尺寸如图3所示,尺寸为43 mm×43 mm×22 cm,小巧别致,易于安装布置,节省空间。同时,整个模块正常工作平均功率不到3 W,非常节能环保。
图3 试管架位信息采集模块外形尺寸示意图(单位:mm)
1.2.1 软件编译环境搭建与移植
在软件设计与实现之前,需要搭建嵌入式Linux集成开发环境[5-6]。为了更好地兼容ARM9主控芯片外设驱动,在宿主机上安装Ubuntu 14.04 Linux桌面操作系统,并在宿主机上解压安装厂家提供的gcc-4.4.4-glibc-2.11.1-multilib-1.0工具链,并配置armfsl-linux-gnueabi-gcc/arm-fsl-linux-gnueabi-g++交叉编译器,同时安装32位兼容库。在交叉编译环境下将Bootloader、kernel(linux-image-3.13.9)、rootfs编译成uImage镜像文件,通过TF卡烧写到ARM9核心板上,重新上电后Linux系统正常启动,则ARM9嵌入式Linux系统构建完成。
在试管架位信息采集识别算法实现过程中,会使用到OpenCV、Zbar等通用图像处理算法类库。因此,在宿主机上通过下载相关库源代码包,使用cmake/configure等生成相应的Makefile文件,通过make指令交叉编译生成库文件,再拷贝到ARM核心板的试管架位信息采集模块底层软件运行目录下,类库正常被加载则移植成功。
1.2.2 软件逻辑功能设计
试管架位信息采集模块底层软件主要由摄像头驱动模块、串口及网口通信模块、条码识别模块、试管有无识别模块、试管类型识别模块、试管液面高度识别模块、补光灯检测模块、异常报警处理模块组成,其内部逻辑功能框图如图4所示。
图4 试管架位信息采集模块底层软件逻辑功能框图
摄像头驱动模块实现对CMOS摄像头的连接控制,并对传入的图像数据流进行接收及缓存。该模块首先加载V4L2驱动,连接并以阻塞模式打开CMOS摄像头设备端口Video0。设置视频捕获方式为V4L2_CAP_VIDEO_CAPTURE,图像尺寸为1 920×1 080像素,图像为YUYV格式,并申请足够的图像缓存空间。启动视频图像采集后,被捕获的帧图像数据自动存入缓存区,可供后续程序读取。
串口及网口通信模块实现人机数据交互控制。该模块以子线程方式运行,串口通信主要实现基本参数读写及上下位机控制命令的交互,网口通信主要实现图像数据向上传输。其中串口通信采用标准的RS232主从双工通信模式,采用10 bit数据帧格式,默认通信帧率为115 200 bit/s。通过加载termios驱动实现对串口设备ttys0的读写控制及在线通信监测,并将接收的串口数据写入缓存区。待数据帧接收完成后,读取接收缓存区数据进行通信解析。网口通信采用传输控制协议(transmission control protocol,TCP)的socket驱动,设置试管架位信息采集模块为TCP客户端模式,在网络物理连接状态下,以定时轮询方式向服务器端请求连接。
条码识别模块实现试管架条码、试管架位试管条码内容解析。该模块通过提取对应条码窗口图像、加载Zbar解码库、运行解码函数来完成对Code128、Code39、Code93、EAN-8、EAN-13、UPC-A、UPC-E等几种类型条码内容的解析。
试管有无识别模块主要对试管架当前架位有无试管样本进行检测。该模块提取试管架位区固定小方块图像与背景图像进行图像匹配计算,根据计算出的相似度偏差值进行试管有无判定。
试管类型识别模块及液面高度识别模块主要用于识别试管样本颜色、类型、浊度以及液位高度,运行于试管有无识别程序之后,实现对试管架位试管全部信息的识别采集。
补光灯检测模块实现对补光电路工作状态的定时监测,运行于主线程中。在主线程空闲状态下,提取缓存区纯背景图像,并进行多分区灰度平均值偏差计算,以此评测补光电路的工作状态。
异常报警处理模块用于对当前检测到的故障状态进行相应的声光报警输出提示。在模块软件主线程中,当软件检测到摄像头加载失败、背景板检测失败、补光灯光照异常等故障时,启动异常报警处理模块,驱动LED与扬声器输出声光报警提示。
1.2.3 软件运行流程设计
试管架位信息采集模块软件为基于Linux平台的嵌入式应用软件,上电动自启动。软件运行流程主要包括软件启动主流程与识别功能逻辑流程。
试管架位信息采集模块底层软件启动主流程如下:模块上电后,uboot加载并启动Linux内核及驱动,Linux系统自动启动模块底层应用软件,模块底层应用软件读取用户参数,捕获并连接CMOS摄像头。软件自检完成后,启动通信线程和图像实时采集线程,检测网口电气连接状态,根据网口电气连接状态启动网络通信功能,在线监控模块状态,实时监测试管架位识别启动通信指令,在接收到识别启动指令后,启动识别功能逻辑流程。启动主流程图如图5所示。
图5 试管架位信息采集模块启动主流程图
识别功能逻辑流程图如图6所示。首先解析指令类型,根据指令类型进入试管架条码识别或试管识别程序分支。如指令为试管架条码识别,则提取试管架条码区域图像,对图像进行条码识别扫描,定位条码区域,进而解析条码内容[7-8],解析成功后上传条码内容;如果解析不成功,则重复条码解析过程,直至识别超时返回主线程。如指令为试管识别,则提取当前架位试管区域图像,进行图像预处理[9],并提取图像特征数据[10],进行当前架位试管有无识别,若试管存在,则进行试管条码、样本颜色、样本类型、样本浊度、样本液面高度识别,识别完成后通信上传当前试管全部信息的识别结果;若识别未完成,则重复执行,直到识别超时返回主线程。
图6 试管架位信息采集模块识别功能逻辑流程图
1.2.4 软件识别算法设计
试管架位信息采集模块软件识别算法主要包括条码识别、试管架位试管有无识别、试管类型识别、试管液面高度识别算法。其中,条码识别主要应用Zbar库来实现,试管架位试管有无识别则采用图像配准[11]算法来完成,试管样本类型识别则是基于图像HSV(hue,saturation,value)色彩空间来判定,试管样本液面识别则通过液面图像特征进行识别。
在识别算法设计中,无色样本液面识别算法难度及复杂度最高,其处理过程如下:
(1)试管感兴趣区(regin of interest,ROI)图像提取。在进样机构的辅助下,试管架位试管均会被推送到固定的检测位置,为了减少图像处理过程中运算资源消耗以及提高处理速度,只对缓存中每帧大图进行ROI图像的截取,如图7所示。
图7 试管架位试管图像
(2)试管图像灰度化预处理。为方便进行后续图像形态学操作,需要对RGB彩色图像进行灰度化处理,故采用加权平均法,其转化公式如下:
f(x,y)=0.299R(x,y)+0.578G(x,y)+0.114B(x,y)式中,R、G、B为图像红、绿、蓝通道的颜色像素值。如图8所示,灰度化后图像变得灰暗,线条轮廓边缘相较原图变得更加明显。
图8 试管架位试管灰度化图像
(3)试管灰度化图像边缘提取。从试管灰度化图像中,可以看到试管液面处有明显的突变暗区,且暗区为封闭块状。采用OpenCV图像处理函数库中的Canny边缘检测算法[12]进行边缘提取,结果如图9所示。
图9 试管架位试管边缘特征图像
(4)试管边缘图像特征提取及液面识别[13]。根据液面边缘为纵向长条线特征,对边缘进行横向投影,从而得到特征直方图,再通过对直方图进行宽度及稀疏度结合判定,进而识别出液面位置。在图10中,各小图中间横向位置的白底黑色标识竖线为软件识别算法输出的液面位置识别结果,从直方图可以直观地看出标识线精准指向液面位置。
图10 试管架位试管边缘特征及直方图像
将试管架位信息采集模块竖直安装于被检测试管架的正对面,且相对距离在COMS摄像头清晰成像工作焦距范围内,如图11所示。在实际应用中,本模块一般被安装于全自动进样机构内(如图12所示),在模块正对面装配纯白色背景板,从而避免拍摄到的试管及试管架图像背景复杂,提高图像对比度,进而增强图像特征,保证识别信息的准确率;同时,在对试管信息识别过程中,还需要进样机构的旋转支架进行试管旋转辅助,在旋转过程中,试管架位信息采集模块动态地对试管条码、样本颜色、样本类型、样本浊度、样本液位高度等进行识别及信息提取。
图11 试管架位信息采集模块实物安装图
图12 全自动进样机构内安装试管架位信息采集模块示意图
为测试试管架位信息采集模块的识别效果,制作了一套试管及试管架测试样本(如图13、14所示),并将测试试管架放于如图12所示的全自动进样机构进样盘上。启动进样机构的老化程序后,进样机构将试管架推送到传送带上,传送带将试管架送入试管架位信息采集模块识别区进行信息识别。在检测完试管架上所有架位信息后,传送带又将试管架回退到最右边初始位置,并进入下一轮重复测试。进样机构通过RS232串口将识别结果传送到PC并保存。试管架位信息采集模块试管识别结果见表1。实验对如图13所示的试管架共进行了4 165次重复测试,测试结果见表2。
表1 试管架位试管识别结果
表2 试管架位信息采集模块测试结果
图13 试管架位信息采集模块测试样品
图14 试管架位信息采集模块测试样品背面
从测试结果来看,试管架位信息采集模块对试管架条码、试管有无、试管条码、样品有无、样品颜色、样品浊度有很高的识别准确率,虽然样品液位识别准确率相对低,但仍能达到99.97%,基本能够满足医疗检测应用的要求。对测试结果进行整理分析发现,样品液位识别错误主要来自于本模块错误地将试管标签边缘识别成了试管样本液面,从而导致液位高度计算结果出错,后续将引入其他识别算法以提高液位高度识别的准确率。
本文以小型化、智能化为指导思想,设计了基于图像识别技术的嵌入式试管架位信息采集模块,可实现对医疗检验设备被测试管架位信息的全自动识别。测试结果表明,本模块有较高的识别准确率,基本能够满足医疗检测数据的可靠性要求。同时,本模块结构简单、体积小、安装及维护十分方便,且成本较低,具有很好的应用前景及推广价值。但是由于样本颜色、标签背景、光照及透明度的多变性,液面特征提取容易受到影响,液体高度识别仍是后续需要持续关注及研究的问题。