丁嗣禹,苗紅霞,齊本勝,張 衡
(河海大學(xué) 物聯(lián)網(wǎng)工程學(xué)院,江蘇 常州 213022)
在工業(yè)生產(chǎn)過程中經(jīng)常遇到需要快速測(cè)量堆狀物料(如煤堆、沙堆、垃圾堆等)體積的情況[1],對(duì)于各種規(guī)則物體,體積計(jì)算有明確的計(jì)算公式,計(jì)算過程簡單方便,但是對(duì)于不規(guī)則堆體的體積測(cè)算就比較困難了。而且此類堆料一般體積較大且較重,直接測(cè)量體積難度較大。傳統(tǒng)的人工稱重等體積測(cè)量方法耗費(fèi)人力、速度慢、誤差大,不能滿足實(shí)際的工業(yè)需求。近年來雙目視覺技術(shù)因其具有非接觸、高精度、快速、自動(dòng)化等特點(diǎn)受到越來越廣泛的關(guān)注[2],同時(shí)雙目視覺技術(shù)的測(cè)距原理可以借鑒到物體的體積測(cè)量領(lǐng)域,因此本文擬采用雙目視覺技術(shù)測(cè)量不規(guī)則堆料的體積。大部分的雙目視覺測(cè)體積的方法都需要借助結(jié)構(gòu)光[3-4],但是這種基于結(jié)構(gòu)光的體積測(cè)量方法在測(cè)量靜態(tài)堆料時(shí)需要保證激光掃描儀以固定的速率平穩(wěn)地滑動(dòng),直至完全掃描堆料才能獲得堆料表面所有點(diǎn)的信息,對(duì)電機(jī)等配套驅(qū)動(dòng)設(shè)施有較高要求,系統(tǒng)操作復(fù)雜并且成本較高[5-6]。目前,也有不借助結(jié)構(gòu)光的雙目視覺測(cè)體積文獻(xiàn)[7],該文獻(xiàn)采用特征匹配的方法完成立體匹配,接著對(duì)堆積體進(jìn)行三維重建,最后利用基于角點(diǎn)的方法進(jìn)行堆積體的體積計(jì)算,該方法在三維重建的基礎(chǔ)上計(jì)算堆積體的體積,算法實(shí)現(xiàn)難度較大。為了降低算法難度,本文采用半全局塊匹配的算法對(duì)堆料圖像進(jìn)行立體匹配求出視差圖,并采用中值濾波和最鄰近插值法對(duì)視差圖中的空洞進(jìn)行填充;在計(jì)算出堆料表面點(diǎn)的深度信息及三維坐標(biāo)信息后,采用改進(jìn)的OTSU閾值分割算法提取目標(biāo)區(qū)域,接著計(jì)算出堆體的底面積、平均高度,最后求出堆體的體積。本文提出的方案硬件方面只需要在堆料上方架設(shè)兩個(gè)攝像頭,盡可能保證攝像頭垂直地面拍攝即可,軟件方面無需對(duì)堆體進(jìn)行三維重建,直接通過對(duì)相機(jī)采集到的堆料圖像進(jìn)行處理即可得出堆料的體積,本方案具有成本低、編程簡單,操作方便的優(yōu)點(diǎn)。
雙目視覺測(cè)距原理如圖1所示,兩個(gè)相機(jī)從不同方向同時(shí)獲取物體的圖像,提取物點(diǎn)在兩幅圖像上的像素坐標(biāo),找到兩幅圖像上的對(duì)應(yīng)點(diǎn),計(jì)算出對(duì)應(yīng)點(diǎn)之間的視差。只要得到了對(duì)應(yīng)像素點(diǎn)之間的視差d(d=xl-xr,其中xl、xr是兩個(gè)成像點(diǎn)在左右兩個(gè)像面上距離圖像左邊緣的距離)就可以根據(jù)相似三角形定理求出物點(diǎn)在實(shí)際世界坐標(biāo)系下的坐標(biāo)[8]。當(dāng)獲取物體表面點(diǎn)的三維坐標(biāo)以后,可以通過數(shù)據(jù)處理計(jì)算出物體的體積。
圖1 雙目視覺測(cè)量原理
本文提出的基于雙目視覺的不規(guī)則堆料體積測(cè)量方案的流程如圖2所示。在開始測(cè)量前要先對(duì)兩個(gè)相機(jī)進(jìn)行雙目標(biāo)定,獲取相機(jī)的內(nèi)外參數(shù)便于后續(xù)的圖像處理。將兩個(gè)CCD相機(jī)垂直置于待測(cè)物料的正上方,保證堆料全部置于兩個(gè)相機(jī)的公共視場中。啟動(dòng)相機(jī)采集堆料的俯視圖像,并將采集到的左右圖像對(duì)發(fā)送到計(jì)算機(jī)上,進(jìn)行后續(xù)的處理。首先,采用opencv中的半全局塊匹配算法(SGBM算法)對(duì)校正后的圖像對(duì)進(jìn)行立體匹配計(jì)算出視差圖,并對(duì)視差圖進(jìn)行空洞填充;接著根據(jù)視差信息計(jì)算出物體表面三維點(diǎn)云坐標(biāo);然后采用改進(jìn)的OTSU閾值分割算法提取目標(biāo)區(qū)域;最后結(jié)合三維點(diǎn)云信息和堆料區(qū)域信息計(jì)算出堆料的平均高度和面積,進(jìn)而計(jì)算出堆料的體積。
圖2 系統(tǒng)流程圖
本文先對(duì)兩個(gè)CCD相機(jī)進(jìn)行雙目標(biāo)定,以建立圖像像素坐標(biāo)系和世界坐標(biāo)系之間的關(guān)系,這是三維信息獲取的一個(gè)重要環(huán)節(jié)[9]。本文采用7*8(30 mm*30 mm)的標(biāo)定板,從不同的角度拍攝標(biāo)定板得到30對(duì)標(biāo)定板圖像。接著采用張正友標(biāo)定法[10]對(duì)采集到的標(biāo)定板圖像進(jìn)行雙目標(biāo)定,獲取相機(jī)的內(nèi)外參數(shù)。其中,內(nèi)參數(shù)包括4個(gè)內(nèi)參數(shù)、5個(gè)畸變系數(shù)(3個(gè)徑向畸變和2個(gè)切向畸變),外參數(shù)包括1個(gè)旋轉(zhuǎn)矩陣和1個(gè)平移向量。由于實(shí)際操作中兩個(gè)相機(jī)的放置無法達(dá)到絕對(duì)平行,導(dǎo)致偏離理想的雙目系統(tǒng)。因此本文采用Bouguet算法對(duì)采集到的圖像進(jìn)行立體校正,建立理想雙目系統(tǒng),即兩個(gè)攝像機(jī)圖像平面平行,光軸和圖像平面平行。同時(shí),對(duì)相機(jī)的徑向畸變和切向畸變進(jìn)行修正。完成立體匹配和畸變修正后得到的堆料圖像就是標(biāo)準(zhǔn)雙目測(cè)距系統(tǒng)中的圖像。對(duì)立體校正后的圖像進(jìn)行立體匹配就可以計(jì)算出左右兩幅圖像中堆料表面點(diǎn)對(duì)應(yīng)的視差值。
視差是指左右雙目圖像中,兩個(gè)匹配塊中心像素的水平距離,而視差圖是以左圖像為基準(zhǔn),儲(chǔ)存左右圖像對(duì)視差值的圖像。對(duì)立體校正后的圖像對(duì)進(jìn)行立體匹配求取視差圖像。本文采用opencv庫中改進(jìn)的半全局匹配算法semi-global block matching(SGBM)算法計(jì)算堆料圖像的視差圖。SGBM算法是在經(jīng)典的半全局匹配算法semi-global block matching (SGM)算法的基礎(chǔ)上改進(jìn)而來的。SGBM算法將SGM算法中每一個(gè)代價(jià)值進(jìn)行塊運(yùn)算后用于SGM算法進(jìn)行視差優(yōu)化,接著進(jìn)行后處理。該算法通過選取每個(gè)像素點(diǎn)的視差disparity,組成一個(gè)disparity map,設(shè)置一個(gè)和disparity map相關(guān)的全局能量函數(shù),使這個(gè)能量函數(shù)最小化,以達(dá)到求解每個(gè)像素最優(yōu)disparity的目的。SGBM算法主要分為4個(gè)步驟:預(yù)處理、代價(jià)計(jì)算、動(dòng)態(tài)規(guī)劃和后處理,調(diào)整這4個(gè)步驟的相關(guān)參數(shù)以獲得較好的視差圖。本文計(jì)算出的視差圖如圖3所示,其中圖3(c)為原始視差圖轉(zhuǎn)換為CV_8UC1格式的圖像。
圖3 計(jì)算視差圖
采用SGBM算法進(jìn)行立體匹配后計(jì)算出的視差圖中不可避免地會(huì)存在很多空洞,即誤匹配的點(diǎn),如圖3(c)所示。因此需要用合適的視差值將視差圖中的空洞填充上。本文預(yù)先設(shè)定了一個(gè)最小視差閾值minDisparity,將所有值小于最小視差閾值的像素點(diǎn)視為空洞點(diǎn)。為了填充視差圖中的空洞點(diǎn),本文先對(duì)視差圖進(jìn)行一次中值濾波,將小連通域的空洞用鄰域窗內(nèi)所有像素值的灰度值的中值填充上,過濾掉視差圖中的離散點(diǎn),也增強(qiáng)視差圖深度信息的連續(xù)性。采用小窗口的中值濾波不僅可以將小鄰域的空洞填充上,而且還可以保證圖像不會(huì)被過度平滑。接著采用最鄰近插值算法將剩余的較大鄰域的空洞填充上,用空洞點(diǎn)的周圍像素點(diǎn)的值來近似填充該空洞點(diǎn)。最鄰近插值算法空洞填充的核心思想是將空洞點(diǎn)的值與其附近的4個(gè)鄰近點(diǎn)的值進(jìn)行比較,用距離空洞點(diǎn)最近的點(diǎn)的像素灰度值填充空洞點(diǎn)的像素值。本文的視差圖中,堆料表面的點(diǎn)視差變化較緩,可以用空洞點(diǎn)周圍的像素點(diǎn)對(duì)空洞點(diǎn)進(jìn)行近似填充。同時(shí),中值濾波算法和最鄰近插值算法運(yùn)算量小,實(shí)現(xiàn)速度快??斩刺畛浜蟮囊暡顖D如圖4所示。
圖4 空洞填充后的視差圖
在獲得物體表面點(diǎn)的視差信息之后就可利用視差和深度之間的數(shù)學(xué)關(guān)系求出物體表面點(diǎn)在世界坐標(biāo)系下的三維坐標(biāo)值,完成空間定位。由雙目相機(jī)的測(cè)量原理可知,視差d和物點(diǎn)的深度Z存在如下關(guān)系:
(1)
其中:B相機(jī)的基線距離,f為相機(jī)焦距。
根據(jù)視差與物點(diǎn)深度之間存在的反比例關(guān)系,得到了Z軸坐標(biāo)信息之后,由此可以推導(dǎo)出X和Y的坐標(biāo):
(2)
其中:fx=f/dx、fy=f/dy,1/dx和1/dy分別表示x方向和y方向上1毫米長度代表的像素值,(u0,v0)為左相機(jī)光軸與圖像平面的交點(diǎn)Ol在像素坐標(biāo)系下的坐標(biāo),(u,v)表示像素坐標(biāo)系中的坐標(biāo)。
本文采用重投影映射的方法實(shí)現(xiàn)像素坐標(biāo)系與世界坐標(biāo)系之間的轉(zhuǎn)換,計(jì)算出物體表面點(diǎn)在世界坐標(biāo)系下的三維坐標(biāo)。將所有三維點(diǎn)云數(shù)據(jù)的Z軸的數(shù)據(jù)提取出來映射成圖像即為深度圖像。本系統(tǒng)中的Z軸坐標(biāo)為攝像頭距離物體表面物點(diǎn)的垂直距離,單位是毫米(mm),表1為根據(jù)系統(tǒng)三維坐標(biāo)求出來的X,Y,Z軸三個(gè)方向的距離和實(shí)際距離之間的比較。
表1 3個(gè)坐標(biāo)軸方向上的測(cè)量距離與實(shí)際距離比較 mm
由于本文得到的視差圖灰度變化較緩,灰度值較為集中,為了方便后續(xù)的圖像處理,本文先對(duì)視差圖像和深度圖像進(jìn)行相同的裁剪去除黑邊,接著找出視差圖的最大灰度值和最小灰度值,將灰度值的變化范圍擴(kuò)大的0~255的范圍中,便于更直觀地觀察圖像處理的中間結(jié)果。
OTSU閾值分割算法(又稱為大津閾值分割法)是一種使用最大類間方差的自動(dòng)確定閾值的方法,是一種基于全局的二值化算法[11]。OTSU閾值分割算法根據(jù)圖像的灰度特性,將圖像分為前景和背景兩個(gè)部分。當(dāng)選取最佳閾值時(shí),前景部分和背景部分之間的差別應(yīng)該是最大的,即類間方差最大。相應(yīng)地,前景和背景之間的類間方差如果越大,就說明構(gòu)成圖像的兩個(gè)部分之間的差別越大,如果部分目標(biāo)被錯(cuò)分為背景或部分背景被錯(cuò)分為目標(biāo),都會(huì)導(dǎo)致兩部分類間方差變小。所以,當(dāng)所取閾值的分割使類間方差最大時(shí)就意味著錯(cuò)分概率最小。
采用傳統(tǒng)的OTSU分割算法對(duì)本文的視差圖進(jìn)行閾值分割,得到的結(jié)果都不夠理想,接近背景的目標(biāo)區(qū)域總是無法被正確地提取出來。因?yàn)閭鹘y(tǒng)的OTSU算法對(duì)于灰度直方圖具有明顯的雙峰特點(diǎn)的圖像分割的效果比較好,但是本文中的堆料的視差圖像的灰度直方圖只有一個(gè)明顯的峰值,背景部分同一灰度級(jí)的像素點(diǎn)占比較大因而具有明顯的峰值,而對(duì)于目標(biāo)部分只有若干個(gè)小的波峰。為了將接近背景區(qū)域的顆粒有效地提取出來,本文對(duì)OTSU算法進(jìn)行了改進(jìn)。
對(duì)于像素點(diǎn)數(shù)為N的灰度圖像,其存在L種灰度,灰度值為i(0≤i≤L)的像素點(diǎn)占整幅圖的比例為pi。設(shè)t(0≤t≤L)為前景和背景之間的分割閾值,則灰度值為[0,t]范圍內(nèi)的點(diǎn)為背景部分,背景像素點(diǎn)占整幅圖像的比例為p0, 其平均灰度值為μ0;灰度值為[t+1,L]范圍內(nèi)的點(diǎn)為前景部分,前景像素點(diǎn)占整幅圖像的比例為p1,其平均灰度值為μ1;記整幅圖像的平均灰度值為μ,背景和前景的類間方差為g,則有:
μ=p0×μ0+p1×μ1
(3)
g=p0×(μ0-μ)2+p1×(μ1-μ)2=
p0×p1×(μ0-μ1)2
(4)
傳統(tǒng)的OTSU閾值分割的方法為找到一個(gè)t使得類間方差g最大,即:
(5)
本文在傳統(tǒng)的OTSU算法的基礎(chǔ)上,將灰度直方圖中分割閾值附近的灰度值考慮進(jìn)來,突出背景與目標(biāo)之間較小差異。具體做法是:計(jì)算出灰度直方圖中分割閾值鄰域內(nèi)所有像素點(diǎn)的概率總和Pt作為類間方差的權(quán)重,構(gòu)建新的目標(biāo)函數(shù)g′,那么新的分割閾值t′使得g′最大。
(6)
g′=Pt×g=
Pt[p0×(u0-u)2+p1×(u1-u)2]
(7)
(8)
這樣強(qiáng)化了波谷處的鄰域信息,加重了波谷處的閾值的類間方差的結(jié)果,將與背景相近的目標(biāo)區(qū)域區(qū)分出來。分別采用傳統(tǒng)的OTSU算法和改進(jìn)后的OTSU算法對(duì)視差圖像進(jìn)行二值化閾值分割,分割的結(jié)果如圖5(b)和圖5(c)所示,分割圖中白色部分為目標(biāo)區(qū)域,黑色部分為背景區(qū)域。從結(jié)果圖中可以很直觀地看出,改進(jìn)的OTSU閾值分割算法可以將接近背景的目標(biāo)區(qū)域有效地提取出來。
圖5 分割結(jié)果示意圖
本文的體積測(cè)量目標(biāo)是堆狀物料,由于此類堆體的俯視圖可以完整地表述堆體的信息,所以由堆料俯視圖求出的深度圖可以較為全面地反應(yīng)出堆料表面點(diǎn)的深度信息。圖6為堆體體積測(cè)量的示意圖,堆料深度圖中的點(diǎn)均勻分布,基于每個(gè)像素點(diǎn)求出的平均深度即可近似等價(jià)于整個(gè)堆體的平均深度,這樣就可以將堆體的體積計(jì)算轉(zhuǎn)換為底面積相同的柱狀物體來計(jì)算。
圖6 堆料體積測(cè)量示意圖
如公式(9)所示,不規(guī)則堆料的體積為3個(gè)方向上的三重積分來求解,可以將整個(gè)堆體用若干個(gè)底面積相同的立方體來近似求解,其中每個(gè)立方體的底面積Δs為圖像中每個(gè)像素點(diǎn)對(duì)應(yīng)的實(shí)際面積,高度為該像素點(diǎn)對(duì)應(yīng)的物點(diǎn)距離背景平面的距離??梢韵惹蟪鲞@些高度不等的小立方體的平均高度,那么堆體的體積就可以轉(zhuǎn)換為這些小立方體的平均高度、立方體的個(gè)數(shù)和立方體的底面積的乘積,繼而轉(zhuǎn)換為堆料的平均高度和堆料底面積的乘積,如公式(10)所示:
(9)
(10)
如果把堆料表面點(diǎn)當(dāng)作離散的采樣點(diǎn),而每個(gè)物點(diǎn)距離地面的高度為采樣點(diǎn)的值,那么這些采樣點(diǎn)的平均值就是堆料的區(qū)域的平均高度。根據(jù)目標(biāo)提取階段閾值分割的結(jié)果,將前景區(qū)域和背景區(qū)域的深度信息分別保存下來,并結(jié)合兩個(gè)區(qū)域的像素點(diǎn)的個(gè)數(shù)分別求出兩個(gè)區(qū)域點(diǎn)的平均深度值Z0和Z1。由于深度圖像中儲(chǔ)存的像素值為物點(diǎn)到攝像頭的距離,所以堆料區(qū)域的平均高度為背景區(qū)域的平均深度值與前景區(qū)域平均深度值之差,即堆料的平均高度近似為h=Z0-Z1。
由于堆料區(qū)域形狀不規(guī)則,直接求取面積很困難,但是在深度圖像對(duì)應(yīng)的實(shí)際區(qū)域?yàn)檩^標(biāo)準(zhǔn)的矩形,而且這個(gè)矩形各個(gè)頂點(diǎn)在世界坐標(biāo)系下的X坐標(biāo)和Y坐標(biāo)很容易獲取。同時(shí)由于本文拍攝的堆料圖像為堆料的俯視圖像,所以深度圖像對(duì)應(yīng)的實(shí)際矩形區(qū)域的面積可直接用矩形的長度與寬度的乘積來表示。接著計(jì)算出堆料區(qū)域占整個(gè)矩形區(qū)域的比例,就可以很容易地計(jì)算出堆料區(qū)域的實(shí)際面積。要計(jì)算深度圖像對(duì)應(yīng)的矩形區(qū)域的面積,先分別提取出深度圖像的左上角和右下角頂點(diǎn)的三維坐標(biāo)A(XA,YA,ZA)、B(XB,YB,ZB),則整幅圖像對(duì)應(yīng)的實(shí)際平面面積S為A、B兩點(diǎn)之間的實(shí)際X方向距離和Y方向距離的乘積。
S=ΔX*ΔY=(XBXA)*(YBYA)
(11)
堆料區(qū)域的面積為堆料區(qū)域的像素點(diǎn)在整幅深度圖中的占比與整幅深度圖對(duì)應(yīng)的實(shí)際面積的乘積。在目標(biāo)提取的過程中已經(jīng)計(jì)算出目標(biāo)區(qū)域像素點(diǎn)占整幅深度圖像像素點(diǎn)的比值p0。所以直接用p0乘以深度圖像對(duì)應(yīng)的實(shí)際面積S就可以求出目標(biāo)區(qū)域的實(shí)際面積S0,即:
S0=S×p0
(12)
通過上文求出的堆料面積和平均高度,可以直接利用體積計(jì)算公式V=h*S0求出被測(cè)堆料的體積。
本文以沙堆為例進(jìn)行堆料體積測(cè)量實(shí)驗(yàn),采用雙目相機(jī)對(duì)體積形狀不同的沙堆進(jìn)行體積測(cè)量實(shí)驗(yàn)。實(shí)驗(yàn)中,兩個(gè)CCD相機(jī)盡可能地垂直地面架設(shè),目的是盡可能獲得沙堆的標(biāo)準(zhǔn)俯視圖,但是即便有所誤差也不會(huì)影響最終的結(jié)果。在采集沙堆原始圖像之前先對(duì)雙目相機(jī)進(jìn)行雙目標(biāo)定,獲取雙目相機(jī)的內(nèi)外參數(shù)。采集沙堆圖像的過程中要保證沙堆放置在兩個(gè)相機(jī)的共同視場中,采集的原始堆料的圖像直接送到計(jì)算機(jī)中進(jìn)行后續(xù)的處理,包括立體校正、立體匹配、視差圖處理、目標(biāo)提取和體積計(jì)算,輸出體積計(jì)算的最終結(jié)果。表2中的6組數(shù)據(jù)為形狀大小不同的6個(gè)沙堆的實(shí)際體積和測(cè)量體積,實(shí)驗(yàn)結(jié)果顯示這6個(gè)沙堆的體積測(cè)量誤差均低于5%,可以滿足實(shí)際工業(yè)需求。
表2 體積測(cè)量結(jié)果及誤差分析
本文基于VS2017+Opencv3.4.1環(huán)境和兩個(gè)分辨率為1280*720的CCD相機(jī)提出一個(gè)基于雙目視差圖的不規(guī)則堆料體積測(cè)量系統(tǒng),實(shí)驗(yàn)證明本文提出的堆料體積測(cè)量方案可以較為準(zhǔn)確地計(jì)算出不規(guī)則堆料的體積,并保證誤差低于5%。本文采用雙目視覺立體匹配獲得視差圖,對(duì)視差圖進(jìn)行處理,測(cè)量出堆料的體積,算法實(shí)現(xiàn)簡單。本方案實(shí)現(xiàn)非接觸式測(cè)量,無需增加其他的硬件設(shè)施操作簡單,經(jīng)濟(jì)實(shí)用。