陆振邦,任传胜
(中国科学技术大学 工程科学学院,合肥 230027)
在泵站的安全调度和优化运行过程中,上下游水位是一个重要的水力要素,而随着泵站智能化建设的推进,对水位的自动化检测也提出了更高的要求[1]。传统的水位监测方式主要有:①人工目测水尺记录水位,这种方式的实时性差,而且费时费力;②采用水位传感器采集水位信息[2]。但是传统水位计普遍存在精度低、稳定性差等问题,而且安装成本高、维护困难。例如国内应用较广的浮子式水位计需要建设测井房,超声波水位计受外部干扰,容易出现水位漂移现象[3]。而且当水位测量值与实际水位值存在较大误差时,仍然需要人工根据水尺刻度手动校正。
综上所述,本文在实验研究的基础上,提出了一种水位测量的新思路。将数字图像处理技术的高精度和嵌入式设备的小巧、轻便结合起来,设计了基于嵌入式图像处理的水位监测系统。目前,在泵站的系统设计中大多存在视频及安防监测单元,因此水尺视频数据的获取也较为容易,这也成为了通过机器视觉技术获取水位值的基础。因为这种非接触测量方式从原理上与传统水位计有较大区别,所以可以有效规避传统水位传感器的一些固有问题,使得水位测量更加直观,同时提高了测量的稳定性、可靠性和高实时性,具有较高的应用前景。
系统采用以ARM920T为核心的S3C2440A为主控芯片,CPU主频最高可达400MHz,搭载了256 MB的NAND FLASH,64 MB的 SDRAM(由两片16 bit宽度的32 MB SDRAM组成),为便于查看中间处理结果,选用了一块分辨率为480×272的彩色液晶触摸屏。此外,基于开发的需求,还配置了串口、USB HOST接口以及实现网络访问所必须的以太网接口。实验中所使用的摄像头为USB接口,支持标准UVC协议。整体硬件结构如图1所示。
图1 系统硬件结构Fig.1 Structure of system hardware
本系统的结构如图2所示。根据泵站总体系统结构框架的设计,整个系统纵向向上可分为现地设备层、现地控制层和站控层。
现地设备层主要包括辅助照明设备、USB摄像头和标准化水尺,照明设备用于在弱光环境下进行补光,USB摄像头采集水尺图像,并传输给嵌入式终端进行图像处理提取数据。
现地控制层主要实现两个功能,一是对摄像头采集的水尺图像进行处理解析以获取水位;二是监听站控层的数据请求,响应请求并发送水位值。
站控层主要提供数据服务与应用服务。包括实时数据交互、历史数据存储、组态显示、趋势分析和阈值告警等功能。
图2 系统整体方案Fig.2 Overall scheme of system
此系统的软件采用Linux操作系统作为开发和运行环境,通过Linux内核的移植、根文件系统的构建、OpenCV图像处理库的移植,搭建了嵌入式软件的开发和运行环境。使用Linux多线程编程技术,将每个子程序设计成一个线程。软件流程如图3所示。
图3 软件设计流程Fig.3 Flow chart of software design
Video4Linux2(V4L2)是针对 Linux系统的视频设备处理架构,它为视频设备的应用程序编程提供了丰富的接口函数[4]。实验中使用的USB摄像头是符合UVC(USB Video Class)规范的设备,在V4L2的编程框架中,主要的采集流程分为打开设备、设置帧格式、分配缓冲区及物理内存、读取数据、处理数据和关闭设备等步骤[5]。
2.3.1 改进的Sobel边缘检测算法
图像的边缘检测是图像处理过程中一项重要的内容和步骤。在本系统图像处理的水尺轮廓的提取、水尺水面分界面的界定都依靠边缘检测技术,所以边缘检测算法的设计是水位提取准确性和精度的关键。传统边缘检测是利用一阶或二阶边缘检测算子与图像直接卷积,根据一定的标准检测边缘,但是这种方法容易产生较多的伪边缘。为了剔除虚假边缘点,本文在边缘检测中引入了非极大值抑制的方法。
首先利用Sobel算子对图像进行水平和垂直方向的梯度计算,而对应的水平和垂直方向的边缘检测算子可表示为
待处理的图像8邻域区域可以表示为
利用模板的图像处理相当于模板与图像的卷积。用Gx和Gy分别代表水平和垂直方向的梯度值,则Gx和Gy可由卷积运算得出:
将横向和纵向梯度值通过式(2)计算出该点的梯度幅值:
原始的灰度图像的边缘属于渐变区域,并不是理想的阶跃信号,利用Sobel算子直接与图像进行卷积运算得到的梯度幅值图像容易丢失边缘信息,必须进行细化。采用非极大值抑制的方法,保留图像目标点水平或垂直梯度上的局部最大点,可将边界细化至一个像素宽度[6]。 设定布尔值 b1,b2,b3,b4为目标点梯度与水平和垂直梯度值大小进行逻辑比较的结果,如式(3)所示:
最后判断邻域梯度是否满足大于水平或垂直梯度的条件,并根据自适应阈值参数进行二值化,则目标点的二值化结果如式(4)所示:
式中:B(i,j)为生成的二值图像;thresh 是根据梯度幅值设定的自适应阈值。
2.3.2 图像处理流程
由于摄像头采集的水尺图像是包含水尺的全域图像,而提取刻度只关心水尺轮廓的目标区域,因此需要将拍摄的图像经过灰度化之后,利用非极大值抑制Sobel边缘检测提取出水尺轮廓,从而将水尺部分截取出来单独进行进一步处理。这样可以避免背景的干扰而造成识别精度低,同时也可以减小图像大小,提高嵌入式设备的图像处理速度和精度。
对于截取下的水尺图像,首先确定水尺在水面上的分界面。由于水尺水面以上和水面以下部分对比明显,利用边缘检测技术可以明确区分两者。然后使用OSTU方法(大津法)对图像进行全局二值化,并把水面分界线以下部分用0(黑色)擦除。由于水尺刻度具有水平方向的延伸性,而刻度数字通常不是规则的,利用OpenCV的连通域分析方法[7]去除数字,提取出刻度线。最后将水尺归一化,分成左右两部分,以便于统计图像处理结果。
Modbus/TCP的数据帧是由MBAP报头和协议数据单元PDU组成,具体格式如表1所示。Modbus/TCP传输过程中使用TCP/IP以太网参考模型的5层,Modbus协议工作在应用层,Modbus/TCP报文被封装在以太网TCP/IP数据包中[8]。Modbus/TCP由于具有网络实施价格低廉、网络部件通用、易于集成、传输量大等特点,在工业领域的应用越来越广泛。
表1 Modbus/TCP数据帧格式Tab.1 Data frame format of Modbus/TCP
本系统将嵌入式设备设计成服务器端,用于处理上位机数据请求并进行相应操作,返回响应。利用BSD套接字接口函数编写通讯程序,主要分为以下7个步骤:
(1)调用 socket()函数创建一个基于 TCP连接的套接字;
(2)调用bind()函数将本地IP地址和端口号绑定到套接字上;
(3)调用 listen()函数使 socket对象处于监听状态;
(4)当客户机发出连接请求时,服务器监听到该请求,调用accept()函数接受请求,从而确定连接;
(5)调用 recv()函数接收客户机发送的请求报文;
(6)分析报文各字段,调用send()函数发送响应报文;
(7)调用 close()函数关闭 TCP 连接,使服务端socket重新进入监听状态,等待下一次连接请求。
本系统以某公司水环境综合监测试验场为测试对象,图4(a)是摄像头采集的一帧图像,图4(b)是经过预处理获取的水尺图像。图5所示为图像处理的结果。水尺最顶部刻度线代表的水位可以在软件中预先设定,根据水面以上水尺的刻度,就能够推算出当前的水位值。
图4 预处理分离水尺图像部分Fig.4 Preprocessing to separate the portion of water gauge image
图5 图像处理结果Fig.5 Result of image processing
为了进行通信验证,将嵌入式设备用双绞线通过以太网口与PC机相连,上位机软件采用北京三维力控科技公司的力控组态软件,版本为Force Control V6.0。进入力控的开发模式,首先定义设备名称、设备地址、设备的IP地址以及端口号,完成IO设备的创建。接下来创建数据库,用于实时数据的处理以及历史数据的存储,在配置完数据库并完成数据链接之后,便创建了一个水位值数据点(SY)[9]。组态软件运行后,可以从实时数据库中看到水位值PV的变化,如图6所示。
图6 实时数据库中的水位值Fig.6 Water level value in real-time database
通过动画连接,将数据库中的数据刷新在主界面上,这样就能将现场真实的数据放映到计算机的监控画面中,从而达到对水位实时监测的目的,如图7所示。
图7 水位值在监控界面上实时显示Fig.7 Water level value is displayed in real-time on the monitoring interface
本文通过结合嵌入式系统技术、图像处理技术和以太网通信技术,设计了水位监测系统,可以实现对泵站前后池水位的实时监测。根据现有的泵站系统结构框架,将本系统进行了分层设计,并详细地介绍了每部分的具体实现。通过实验表明,本系统能够实现水位监测的基本功能,有很高的稳定性和可靠性,具有广阔的应用前景。