1. 引言
安全是水资源、水环境和水灾害的综合效应,兼有自然、社会、经济和人文的属性。建立兼顾防灾和水资源优化管理的保证系统,是现代水利及水利工程的需要。近年来由于城镇化加速发展和极端性天气频发,暴雨洪涝灾害已成为我国很多城市最主要发生的灾害。水位作为一项重要的水文参数,对于水资源管理、水环境保护、水利工程的设计建设运行全过程、以及防洪减灾等具有很大的应用价值。近年来水利工程建设推进“智慧水利”的发展,将人工智能方法应用于水位监测是一个重要的研究方向,构建可靠的水位监测系统对于水资源管理及水安全问题有着重大的意义。
通过对水位数据的实时监测和分析,可以优化水利工程的调度方案,提高水资源的利用效率,同时在洪水等极端天气事件中,可以迅速做出预警和应急响应减少灾害损失。同时水位监测数据对水文、气象、地理等学科具有重要的研究价值,通过分析水位数据可以研究水循环、气候变化等科学问题。目前国内的水文观测站大多使用传统的人工观测和水位计来检测水位,传统的人工观测方法不但耗时耗力,而且对观测人本身存在一定的人身安全问题。而使用水位计检测水位则对监测对象的水质有较高的要求,传感器长期淹没在水中会受到河床沉淀物及水生物的影响会导致水位检测出现较大的误差,且传感器的安装与维护成本较高。为了更加经济高效地完成水位检测任务,有学者提出了通过摄像头定时定点拍摄水尺图像返回终端,再使用图像识别的方法来检测水位。
智能化的水位检测方法是水利行业发展的必然趋势。智能化的水位检测不仅可以减少人工成本,还能避免人为因素导致的测量错误,从而提高水位数据的可靠度。同时智能化的水位检测效率更高,能够及时对突发事件如暴雨、洪水等做出预警,以此尽可能地减少灾害损失。OpenCV提供的视觉处理算法非常丰富,加上其开源的特性,十分适合用于图像识别来检测水位。本文基于OpenCV库,设计并实现了一套水位识别系统,通过图像预处理、边缘检测、线条提取和数字识别等步骤,实现了水位的自动读取。
2. 相关工作
水位识别作为智慧水利的关键技术,近年来受到广泛关注。研究方法主要分为传统计算机视觉方法和深度学习方法。传统方法基于图像处理技术,如OpenCV库提供的边缘检测、霍夫变换等算法,具有计算效率高、可解释性强等优点,但依赖手工特征设计,对复杂环境适应性有限。例如,本文基于OpenCV的水位识别系统通过预处理、线条检测和模板匹配实现水位提取,属于典型传统方法,但在光照不均或拍摄倾斜时易出现误差。深度学习方法则利用神经网络自动学习特征,适应性强:王坤侠等[1]融入注意力机制,提升了水位检测的鲁棒性;叶祖超等[2]基于神经网络实现潮位水尺读数的智能化识别,准确率较高,但需要大量标注数据。此外,贠剑虹等[3]结合联合特征定位,平衡了传统与深度学习的优势;孔庆珠[4]利用无人机摄影图像,扩展了水位测量的应用场景。对比而言,传统方法适合资源受限场景,而深度学习方法在复杂环境下更具潜力,本文方法作为传统代表,为后续集成深度学习提供了基础。
3. 算法原理与系统设计
3.1. 水位识别算法原理
本文的水位识别算法主要基于图像处理技术,流程包括图像采集、预处理、特征提取和水位计算。首先对采集的水尺图像做预处理,包括灰度化、灰度变换、二值化、中值滤波等过程。对预处理后的图像使用边缘检测算法(Canny算子)获取水尺图像中的水尺边缘,再通过对图像行列像素和的特征分割出水尺区域图像。对水尺区域图像使用结合形态学、图像取反、矩形轮廓检测的方法去除图像中非水尺刻度线的部分,得到水尺刻度图像。水尺刻度图像中的刻度线为白色,非刻度线的背景为黑色,通过统计图像水平像素和图像中峰的个数结合水尺量程计算出水位。
水位识别流程图如图1所示。
Figure 1. System flowchart
图1. 系统流程图
3.2. 详细设计
系统设计分为图像输入、预处理、线条检测、交点计算、数字识别和结果输出模块。图像输入模块通过摄像头或存储图片获取水尺图像;预处理模块包括缩放、高斯滤波、灰度化和二值化,以增强特征;线条检测模块使用霍夫变换提取水尺的横竖线;交点计算模块通过求解线条交点定位水面位置;数字识别模块通过模板匹配识别水尺上的数字;最后输出水位高度。
数字的识别是在提取到数字的图片后与预先准备好的数字模板图片进行匹配打分,例如模板文件中数字0的模板如图2所示。
Figure 2. Template image of the number 0
图2. 数字0的模板图片
需要被识别的水位标尺图片存放在water文件夹中,如图3所示。
Figure 3. The picture of the water level gauge that needs to be identified
图3. 需要被识别的水位标尺图片
算法核心包括自定义函数用于线条清理和交点计算:
cleanlines函数:清除霍夫变换检测到的重复线条,通过比较rho和theta值合并相似线条。
IntersectionPoints函数:计算横线和竖线的交点,从而确定水面位置。横线取rho最大值,竖线取rho最大的三条,通过求解线性方程组得到交点坐标。
4. 系统实现
4.1. 系统架构与工作流程
基于OpenCV的水位识别系统采用模块化设计,整体架构分为图像输入、预处理、特征提取、水位计算和结果输出五大模块。系统工作流程遵循图像处理的基本范式,首先通过摄像头或存储图像获取水尺图片,然后进行一系列预处理操作以增强特征,接着提取水尺边缘和刻度线,通过交点计算定位水面位置,最后识别水尺数字并输出水位值。
系统设计注重鲁棒性和效率,能够适应不同光照条件和拍摄角度。
系统初始化时,会加载预定义的参数,如图像缩放宽度(默认400像素)、高斯滤波核大小、Canny边缘检测阈值等。这些参数基于实验优化,以平衡处理速度和准确性。例如,缩放宽度设为400像素可在保留足够细节的同时减少计算量。工作流程的核心是迭代处理每个图像帧,实时输出水位高度,适用于动态监测场景。
4.2. 图像采集与预处理模块
图像采集模块支持多种输入源,包括本地图片文件、RTSP视频流(如网络摄像机)和实时摄像头捕获。对于网络摄像机,系统通过OpenCV的VideoCapture类连接RTSP URL,例如rtsp://admin:Cumt123456@192.168.1.64//Streaming/Channels/1,并设置重试机制以处理网络波动。采集到的图像首先进行缩放,将宽度固定为400像素,高度按比例调整,以标准化输入尺寸,减少后续计算复杂度。缩放算法使用双线性插值,保证图像质量。
预处理阶段包括灰度化、滤波降噪和二值化。灰度化采用OpenCV的cvtColor函数,将BGR图像转换为灰度图,减少数据维度。滤波操作使用高斯滤波(核大小通常为9 × 9),有效抑制噪声的同时保留边缘信息。高斯核的选择基于水尺图像特性:核过大可能导致边缘模糊,过小则降噪效果不佳。随后,应用自适应阈值二值化(Otsu算法),自动确定最佳阈值,将图像转换为黑白二值图,突出水尺刻度特征。二值化后,进行形态学操作(如膨胀和腐蚀)以连接断裂的刻度线。膨胀使用矩形核(20 × 30),填充细小间隙;腐蚀使用较小核(3 × 6),消除孤立噪点。
预处理模块还包含光照补偿机制,针对过曝或过暗图像,采用直方图均衡化增强对比度。这提高了系统在复杂光照下的适应性。整个预处理流程耗时约占系统总处理时间的30%,是保证后续步骤准确性的基础。
4.3. 特征提取与边缘检测模块
特征提取模块旨在定位水尺结构和刻度线。首先,使用Sobel算子计算图像梯度,分别检测水平和垂直边缘。Sobel算子核大小为3 × 3,计算x和y方向的梯度值,然后合并为整体边缘强度图。这一步骤能有效突出水尺的垂直边缘(如标尺边框)和水平边缘(如水面线)。接着,应用Canny边缘检测算法,设置低阈值40和高阈值80,提取连续边缘。Canny算法通过非极大值抑制和双阈值连接,生成单像素宽度的边缘图,为线条检测奠定基础。
边缘检测后,系统利用霍夫变换(HoughLines函数)检测直线。霍夫变换参数包括距离分辨率ρ = 1像素、角度分辨率θ = π/180弧度,和阈值20 (表示检测直线的最小投票数)。变换后得到线条参数(ρ, θ),其中ρ表示原点到直线的距离,θ表示角度。为去除重复检测,系统调用自定义的cleanlines函数,该函数通过比较ρ和θ的差异(ρ差 < 10像素且θ差 < 0.2弧度)来合并相似线条,确保每条直线唯一代表水尺的一部分。
特征提取模块还集成了多尺度处理:对于远距离拍摄图像,水尺刻度可能细小,系统会先进行图像金字塔下采样,再应用边缘检测,以提高对小特征的敏感性。该模块的输出是清理后的线条集合,作为水面定位的输入。
4.4. 水面定位模块
水面定位模块的核心是通过线条交点计算确定水面位置。系统将线条分为横线(接近水平,θ ≈ 0)和竖线(接近垂直,θ ≈ π/2)。横线中,选取ρ值最大的线条,代表水尺最下方的水平线(通常对应水面);竖线中,取ρ值最大的三条,代表水尺的垂直边框。交点计算通过求解线性方程组实现:对于每条横线l1和竖线l2,构建矩阵方程Ax = b,其中A包含l1和l2的方向余弦,b包含它们的ρ值,然后使用NumPy的linalg.solve求解交点坐标。
交点计算后,系统对多个交点取平均值,得到水面中心点(midX, midY)。这一步骤能抵消图像畸变或拍摄倾斜带来的误差。为提升鲁棒性,模块加入了异常处理:如果交点数量不足或分布异常,系统会回退到基于历史数据的预测,或标记为低置信度结果。水面位置最终映射回原图坐标,通过比例缩放(原图高度/处理图高度)得到真实像素值。
该模块还考虑了透视校正:当拍摄角度非正对时,水尺可能呈现梯形畸变。系统可选应用透视变换(基于检测到的水尺角点),但会增加耗时,因此默认关闭,仅在高精度模式下启用。水面定位的准确性直接影响最终水位值,实验显示其误差通常在±5像素内,对应实际水位约±1 cm。
4.5. 数字识别模块
数字识别模块负责提取并识别水尺上的刻度数字。首先,基于水面位置裁剪水尺区域图像,通常选择水面以上50像素到水面以下100像素的范围,以覆盖可能出现的数字(如“10”“20”等)。裁剪后的图像进行二次预处理:高斯滤波(3 × 3核)降噪,然后二值化。二值化时,系统检测图像中黑白像素比例,如果白底黑字则反转为黑底白字,确保数字为白色连通区域。
数字提取通过轮廓检测(findContours函数)实现,使用RETR_EXTERNAL模式只检测外轮廓,CHAIN_APPROX_SIMPLE压缩轮廓点。提取的轮廓用矩形包围盒(boundingRect)过滤,只保留宽高比在2.5:1到10:1之间的区域,以排除非数字噪声。过滤后的数字区域按水平位置排序,确保从左到右处理。
识别过程采用模板匹配法。系统预存0-9的数字模板库(如图2-2所示),每个数字有多个变体(如不同字体),存储于refer10文件夹。匹配时,对每个待识别数字,先缩放至模板尺寸(通常50 × 100像素),然后使用OpenCV的matchTemplate函数计算相似度,采用TM_CCOEFF相关系数法评分。得分最高的模板即为识别结果。例如,数字“0”的模板匹配过程:将处理后的数字区域与模板库中的“0”图像比较,取最高分作为输出。
为提高准确性,模块引入了多模板投票机制:如果多个模板得分接近,系统综合上下文(如数字位置关系)决策。最终,识别出的数字组合为水位值(如“3”和“6”组合为36),并乘以刻度单位(10 mm)输出。该模块在清晰图像下准确率超90%,但受光照和污渍影响较大。
5. 实验与测试结果
实验使用100张水尺图像(water文件夹)进行测试,系统通过交互界面选择图片号进行处理。程序运行后,用户输入图片号(如7),系统依次显示原图、预处理结果、线条检测和数字识别过程。
选择7号图片进行识别的界面如图4所示。
Figure 4. Recognition interface
图4. 识别界面
读取并展示图片后,系统进行预处理和识别,结果如图5所示。
Figure 5. Recognize and read the image and perform preprocessing
图5. 读取图片并预处理
最终识别水位为36 mm,输出结果如图6所示。
Figure 6. Output result
图6. 输出结果
测试结果表明,系统在多数图像中能准确识别水位,平均处理时间小于2秒。但对于光照不均、拍摄角度偏差较大的图像,识别误差会增加。通过调整参数和优化模板匹配,准确率可进一步提升。
6. 结论
水位资料对水资源管理及预防洪涝灾害具有重要的参考意义和应用价值。传统的人工观测方法收集水位资料需要耗费大量的人力物力,且容易受到人为因素的干扰。在智慧水利的大环境下,通过视频图像智能获取水位资料已成为一种必然趋势。
本文使用了基于OpenCV的水位识别能够大量节省人力物力。但是当实际的水位检测任务中通过摄像头等设备采集的水尺图像会更为复杂,本方法依然会因为图像质量差,拍摄角度差等原因出现判断错误,因此仍然需要后续继续改进。未来工作将聚焦于深度学习方法的集成,提高对复杂环境的适应性。