APP下载

基于视觉的发电机油位检测与控制研究

2017-11-02李洋洋

软件导刊 2017年10期

李洋洋

摘要:设计了一种基于图像视觉技术的发电机油箱油位检测与控制系统。通过MVCII1MM黑白相机采集油位观察口液位图像,通过USB2.0接口传送到工控机,采用自适应阈值二值化、椭圆检测、直线检测等一系列图像检测技术,得到当前油位高度,通过RS232接口传入PLC,根据油位高度打开液位阀进行相应的添油、排油、报警等操作。

关键词:图像视觉;发电机油位检测;二值化;直线检测

DOIDOI:10.11907/rjdk.171698

中图分类号:TP319文献标识码:A文章编号:16727800(2017)010013903

0引言

传统的发电机油箱油位检测是靠人工观察和浮子阀控制,可靠性不高,难以及时获取油箱液位数据并进行相应操作,容易出现事故,需要一种稳定、安全、有效的液位检测技术。

随着科技的发展,人们研制出多种液位检测方法,如浮子式、压力式、电容式等[1]。由于发电机油箱密封,易燃、易爆,对压强要求高,非接触式液位检测方法是首选。常见的非接触式液位检测方法有雷达式液位检测、激光式液位检测、基于图像视觉的液位检测等等[2]。雷达式液位检测精度高,但成本高且技术难度大;激光式液位检测可在易燃易爆环境下进行,抗干扰能力强,但对安装空间及激光头防腐要求高;基于图像视觉的液位检测,经图像采集后由计算机进行处理获得液位高度。这种检测方法具有适应性好、检测精度高等优点。

本文提出基于图像视觉技术的发电机油箱油位检测与控制系统。通过微视工业摄像头采集油箱液位观察口液位图像,在VC++6.0平台下配置OpenCV1.0,对图像进行一系列图像处理获得油位的高低,并通过PLC打开液位阀进行相应的添油、排油、报警等控制。

1系统结构设计

系统由图像采集装置、PLC、工控机、RS232接口几部分组成。油箱液位由图像采集装置(相机、光源)采集图像,传入工控机,进行数字图像处理得到液位高度,通过RS232接口传入PLC,与PLC中预设好的上下限位阀进行比较,发出控制阀门和报警器信号。系统框图如图1所示。

系统CMOS光学传感器采用北京微视公司的MVCII1MM黑白摄像头,采用USB2.0接口,可使用自身SDK函数库进行二次开发,采集实时图像。

常见的照明技术有背光照明、直接照明、散射照明、同轴照明等[3]。由于本设计是对密封油箱液位观察口里的液位进行检测,不易采用采光效果较好的背光照明,但如果采用直接照明,观察口是玻璃材质会引起镜面反光现象,故使用同轴照明,即设置一块45°半透半反玻璃,LED灯發出的光线垂直照在液位观察口,从液位观察口反射的光向上穿过半透半反玻璃进入摄像头。这样消除了反光,图像中也没有摄像头影子。

选用三菱FX2N作为控制单元,只需使用一个IO口接收由FX2N232BD 通讯模块接口传来的液位高度信息,3个数字输出口用来控制补油阀、排油阀和报警器。

2基于OpenCV的视觉测量软件

视觉测量系统软件设计流程:微视相机采集实时图像,进行图像转换成OpenCV的数据类型,再采用OpenCV 库函数进行处理分析,如图3所示。

2.1图像采集预转换

使用微视公司的MVCII1MM工业摄像头,不能直接调用OpenCV函数打开视频函数进行采集,只能使用自身SDK函数。先初始化设备,使用cvSetData函数对每一帧图像进行格式转换,转换成OpenCV 库函数常使用的IplImage数据类型,再利用相关图像处理函数对采集的图像进行处理分析。对图像的圆和直线进行检测,模拟油位观察口和油位检测效果。初始化函数和转化程序如下:

(1)设备初始化函数MV_Usb2Init。

int nRet = MV_Usb2Init("MVC1000", &nIndex, &m_CapInfo, &m_hMVC1000);

"MVC1000"用于表示摄像机的字符串

nIndex当此函数调用成功时返回,返回MVC1000相机索引,本设计只采用一个摄像头,则返回0

m_CapInfo用于初始化捕获视频帧的参数

m_hMVC1000返回的MVC1000设备句柄

(2)设置每帧显示前的图像处理回调。

MV_Usb2SetFrameCallBack( m_hMVC1000, FrameCallBack, this )

FrameCallBack是设置的回调函数指针,里面的第一参数是sdk开发包送出的采集图像像素首地址指针[3],本文通过这个指针访问并转换处理图像数据。

(3)图像格式转化程序。

void CDlgDemoDlg::FrameCallBack(BYTE *pData)

{

int nScaleMode = GetScaleMode( &m_CapInfo );

for( int i= 0; i< 20; i++ )

for( int j= 0; j<30; j++ )

pData[i*m_CapInfo.Width/nScaleMode+j] = 255;

IplImage*src_Img=cvCreateImageHeader(cvSize(m_CapInfo.Width,m_CapInfo.Height),IPL_DEPTH_8U,1);

cvSetData(src_Img,pData,m_CapInfo.Width);//根据 BYTE*图像数据指针设置IplImage图像头的据数据

}endprint

2.2图像预处理

视频采集画面常常超过液位观察口大小,为此可对图像设置感兴趣区域ROI,以降低边缘检测的复杂性,减少区域干扰,节约图像处理时间。使用OpenCV函数cvSetImageROI(),在图像中央设置一个长300宽300的矩形区域,只对这个区域进行图像处理和分析。

使用Gamma矫正进行图像增强,将gamma值设置为0.7,增强暗光部分。然后使用cvSmooth()函数对液位图像进行平滑处理,消除噪声。平滑方式选用CV_MEDIAN中值滤波方式,滤波板块选用3×3板块,使图像孤立的噪声边大大减少,液位线和观察口的轮廓边变清晰。

2.3自适应阈值二值化

虽然光照系统设计很好,但还是会出现光照不均、突发噪声等情况。假设使用一个恒定的全局阈值量对油位图像二值化,会因为不能照顾所有的地方而影响二值化效果。本文使用OpenCV的自适应二值化函数void cvAdaptiveThreshold(const CvArr* src, CvArr* dst, double max_value,int adaptive_method=CV_ADAPTIVE_THRESH_MEAN_C,int threshold_type=CV_THRESH_BINARY,int block_size=3, double param1=5)。这个函数转换方法由threshold_type参数类型决定 [4],这里选用CV_THRESH_BINARY_INV类型,其转换公式如下:

dst(x,y)=0ifsrc(x,y)>T(x,y)

max_valueotherwise(1)

其中任一个像素点的阈值T(x,y)都不一样,通过选择CV_ADAPTIVE_THRESH_MEAN_C方法,计算像素点周围区域的均值,再减去param1常数来得到相应阈值。这种自适应图像二值化方法不仅有二值化效果,还可以获得物体边缘,起着边缘检测的作用。

2.4液位观察口外轮廓拟合

在拟合类椭圆时本文采用经典的最小二乘法。最小二乘法即在随机误差项大体服从高斯分布后,结合最大似然估计法建立一套最优估计法,运用此估计法可估算出离实际数据最近的未知数据。换言之,使估计的数据结果与实际数据之间的离差平方和达到最小。

设椭圆方程:

Ax2+Bxy+Cy2+Dx+Ey+F=0(2)

为避免出现全为0的解,在参数设置时再添加一个数值约束条件:假定A+C=1,将该约束条件直接带入公式(2),即用最小二乘法分析检测到的边缘点数据,继而求取目标函数f(A,B,D,E,F):

f(A,B,D,E,F)=

∑ni(Ax2i+Bxiyi+Cy2i+Dxi+Eyi+F)2(3)

解出函数(3)中的系数值(A,B,…,F),再通过极值原理即目標函数,对各系数求为0的偏导数,从而使f(A,B,D,E,F)最小:

fA=fB=fD=fE=fF=0(4)

结合约束条件,建立一个由6个等式组成的线性方程组。6个方程,6个未知数,求出唯一解,即所要估计的参数值[5]。

最小二乘法参数估计,调用Opencv中的cvFitElipse()库函数即可完成对椭圆的最小乘法拟合,视觉上表现为返回一个与实际图像最为近似的轮廓椭圆。假设轮廓椭圆在成像中的短轴半径为r,椭圆心坐标为(xr,yr)。

2.5液位线检测

本文采用hough变换检测直线。在平面直角坐标系中,一条直线一般都用式(5)表示:

y=kx+b(5)

假设点(x0,y0)为直线上的一个定点,有y0=kx0+b,为参数平面(k-b)的直线,即图像中的每个点的位置都与参数平面中唯一的一条直线对应,图像中的任意一条直线都有唯一的一个参数平面中的点与之对应。用霍夫变换处理图像中所有点,其中直线相交频繁的点所在的直线即所要检测的直线。

工程数学中常用极坐标参数方程表示直线:

p=xcosθ+ysinθ(6)

直线检测调用Opencv中的cvHoughLines2库函数。根据检测到的液位直线与直线检测原理,即可求解出液位线上的一个点(xp,yp)。图4、图5为检测前的图像和检测完拟合好的椭圆和直线图像。

2.6油位高度测算方法

处理上述图像得到椭圆和直线的相关参数,代入公式(7)即可求出油位高度h。

h=yr-yp+r2r×1 0000

其中:yr为椭圆圆心y的坐标值,yp为液位线坐标值,r为椭圆短轴半径。

3油位控制

油位高度信息通过RS232接口传入到PLC并进行相应处理。工控机得到液位高度信息,经过RS232接口,PLC将其与预设好的上下限位阈值比较。当油位低于设定下限阈值时,打开补油阀,油箱进油;当油位高于设定上限阈值,则打开排油阀排油;当油位在设定值范围内则关闭阀门。通过PLC显示当前的油位与阀门状态,根据设定好的油位上下限与当前实际值之间的变化控制阀门开关,实现注油、排油。当油位超过上限阈值或低于下限阈值,开始报警。

4结语

本文基于视觉OpenCV设计了一套发电机油位检测与控制智能系统,能自动监视发电机油箱油位实时数据并进行相应处理。系统辅助设施简单,大大节省了人力物力,为发电机液位智能化管理提供了解决方案,很大程度上避免了意外事件的发生。在后续工作中还需要研究照明系统在光线不足情况下的实时曝光补偿,以及更高效的液位检测算法。

参考文献参考文献:

[1]刘治锋.基于图像的水位自动检测研究[D].南京:南京理工大学,2004.

[2]龚声蓉,刘纯平,王强,等.数字图像处理与分析[M].北京:清华大学出版社,2006.

[3]王敏,夏咸军.新型LED背光源技术及应用[J].光电子技术,2005,25(4):267270.

[4]刘瑞祯,于仕琪.OpenCV教程基础篇[M].北京:北京航空航天大学出版社,2007.

[5]刘江,张岑.基于OpenCV的圆形标记点的提取[J].组合机床与自动化加工技术,2013(5):2628.

责任编辑(责任编辑:杜能钢)