李洋洋
摘要:設計了一種基于圖像視覺技術的發電機油箱油位檢測與控制系統。通過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. 責任編輯(責任編輯:杜能鋼)