俞圣池,李佳康,熊鑫泉,賀劉剛1,,,何瑞麟,戴 陽 ,3
(1上海海洋大學信息學院,上海 201306;2 中國水產科學研究院東海水產研究所,農業農村部漁業遙感重點實驗室 上海 200090;3 嶗山實驗室,山東 青島 266237)
在養殖中,實時監控個體大小對于制定養殖方案、合理分配飼料、控制養殖密度等均具有十分關鍵的作用,并將對養殖企業的生產經營與品質控制產生重大影響[1]。魚體尺寸測量的方式可分為接觸測量和非接觸測量。目前,養殖過程中采用接觸測量比較多,需要將魚捕撈后人工測量。這個過程不僅效率低,樣本數量少,更影響了魚群的生長[2]。為解決魚體的非接觸測量,目前主要有雙目視覺[3]、聲吶[4]、激光[5]等技術途徑。其中,激光測量[6-10]技術不僅可以用于陸上物體測量,同樣可以用于在水底作為一種主動視覺探測手段,其具有精度高、原理簡單、成本低、易實現的特點。劉源等[11]基于線激光三角法實現了對圓孔尺寸的測量,通過對比分析確定HOUGH圓變換法在環規標準件的測量中的適用性,并取得了令人矚目的試驗結果,誤差僅為2 μm。這為基于線激光三角測距法的精準測量提供了一個可行的方法,并豐富了測量工具的選擇。另一方面李坤等[12]通過自行研制的 532 nm 強度調制激光源,在 3 m 長的水箱中搭建了激光水下探測系統,運用相位法的測距原理成功實現了水下激光測距,并有效抑制了散射和湍流的影響,這為基于線激光三角測距法在水下環境中的應用提供了有力的支持,但載波調制激光雷達成本高,且在3 m內測量誤差高達12 cm。此外,解則曉等[13]設計了一種創新的水下雙目測量系統,利用線結構光陣列提供視覺特征,通過推導水下雙目光路折射模型,并引入改進的外極線匹配方法,成功獲得特征點的三維坐標。這一系統在水下物體測量和三維形貌還原方面取得了顯著成果,測量誤差僅為0.3 mm。這為本研究提供了線激光作為特征點的啟示,尤其在處理水下環境中的復雜問題上,但其測量過程參數多且復雜。浙江大學李艷君等[3]提出了一種基于立體視覺的動態魚體尺寸測量方法,通過雙目攝像頭獲取魚體的三維信息,并運用掩膜卷積神經網絡進行魚體的檢測與分割。這項研究不僅解決了傳統魚體測量中費時費力的問題,還推動了深度學習技術在漁業中的應用,但其根本基于雙目系統,本研究將從單目的角度研究魚體測量。綜合而言,激光測距的精度高且應用相當廣泛,測距與魚體尺寸測量密不可分[14],通過對水下物體測距并結合相機的成像原理[15],即可得出魚體表面的三維空間坐標,同時得出魚體的尺寸信息。
本研究基于線激光三角測距法的測距原理并加以改進,開發了一種基于線激光三角測距法的魚體測距系統,可為魚體尺寸測量定位出物距提供更多的思路,為水產養殖發揮更大的作用。
水下魚體激光測距系統如圖1所示,包括視頻采集裝置,圖像處理程序。采集裝置為固定于同一個支架上的兩個水下網絡攝像機,攝像頭的分辨率像素為2 560×1 440,視頻錄制幀率為30 Hz。

圖1 水下魚體激光測距系統
通過網線POE供電與海康威視硬盤機相連接,硬盤機儲存視頻數據。上攝像頭具有一定的傾斜角度,而下攝像頭是水平固定的,增大了拍攝范圍。最底端固定的是專門定制過的防水一字線激光器。刻有固定長度的矩形標定板。試驗樣本為黑魚 1 條、小鯽魚 3 條、大鯽魚 2 條、鱸魚 1 條。圖像處理程序主要是進行數據采集、分析、計算、結果輸出等功能。編寫語言為Python,基于計算機視覺[16]開源庫OpenCv獲得激光輪廓結合算法分析得到激光線的重心坐標,運用Pytorch深度學習框架進行非線性回歸訓練得到重心在圖像中的像素點位置與實際物距離的關系。
在激光測距中常用的方法有飛行時間法[17]、相位測量法[18-20]、三角測距法[21]等。飛行時間法也叫直接測距法,即通過發射一束脈沖激光,測量激光從發射到接收所經過的時間,并根據光速計算出距離。這種方法適用于較遠距離的測量,但需要考慮激光脈沖的展寬效應[22]。相位法是利用激光的光波相位變化來測量距離[23],在發射端,將發出的激光進行調制,使其成為一定頻率的相位調制光,在接收端,通過檢測光源發射的相位變化來計算距離。它可以精確地測量距離,具有高度的精確度,但需要復雜的裝備。而三角法測距是利用激光發射點和接收點的幾何關系計算距離[24],激光器向被測物體發射激光束,物體表面反射回來通過攝像頭接收成像,根據相機的成像原理,如果標定物沿著激光束的方向發生位移時,則相機成像面上的像點也會發生相應位移,通過物像位移之間的關系可以計算出被測物上被激光照射的各點坐標,進而得到被測物到攝像頭鏡面的距離。相比于前面提到的飛行時間法和相位測量法,三角法測距方法精確度適中,實施簡單,且不需要較為復雜的裝備,成本低。因此本研究選用的測量方法為基于線激光的三角法測距。線激光三角法測距的光路原理[25]如圖2所示。

圖2 光路原理
一字線激光器發出的扇形光面與激光器和攝像頭的連線BC垂直,激光器發出的光照射到物體上就是一條水平的亮線。
為方便計算,系統需要事先選擇一個已知的基準距離S0(AB)作為定標基準。一般情況下,基準距離S0(AB)的選擇取決于設定的測距量程中點,如量程50 cm到150 cm,則S0選擇100 cm。一字線激光器的光線從A點射出,在基準面上形成亮線ML。激光器照射待測平面后,形成亮線NK。過基準點A的光線在待測平面上的投影點為E。接下來計算任一光線BM在該平面上的投影點N的位置。建議調整攝像頭,使CCD成像面豎直放置且像素沿豎直和水平方向排布。取以豎直方向為x軸方向,以水平方向為y軸方向,以基準點A的像A1為原點的平面直角坐標系,在CCD上建立成像平面直角坐標系。這樣,任意一點的坐標(x,y)可以方便地通過像素尺寸和像素數計算得出。在該圖中,M、A、L、N、E、K在CCD上的成像坐標分別為M1、A1、L1、N1、E1、K1。
對于不過基點A的任一條光線,如圖中的BM,其照射到后面的豎直平面上的N點,N在CCD上成像點為N1,下面通過已知量N1的坐標(xN1,yN1)、S0(AB)、h(BC)、焦距f計算S1(EA)、N點與攝像頭鏡面物距U(EC)、和YN(NE)獲得N點的位置。
ΔNEC∽ΔN1E1C
(1)
在ΔECA中:

(2)

(3)
式(3)帶入(1)得:
(4)
不難看出,在以B點為原點的過B點與LM平行的直線為Y軸,BA為X軸,BC為Z軸的空間坐標系中,N點的空間坐標XN=S0+S1,YN=NE,ZN=0。
同理,若N點位于B,M之間可計算出:
(5)
(6)
此時N點的空間坐標XN=S0-S1,YN=NE,ZN=0。
通過上述獲得N點空間坐標的方法得出圖像任意點的空間坐標,從而計算魚體大小。
根據上述推導公式,只需測量S0(AB)、h(BC)長度,結合鏡頭焦距f和N點在攝像頭上的成像N1坐標,即可計算N點空間坐標。但實際系統中難免會產生誤差,本系統主要誤差包括以下幾種:(1)系統裝配誤差,包括AB、BC長度及鏡頭焦距f測量不準確和發出的激光不與BC垂直所導致的誤差;(2)因鏡頭畸變帶來的成像與理想狀態差異所致的測量誤差;(3)因系統在水中工作,攝像頭和激光器均安裝在防水盒內,盒內部是空氣介質,光線需穿過空氣、玻璃和水三種介質,由于介質折射率不同和光線入射角度不同所致的非線性偏折誤差[26],加上防水窗口質量及安裝問題而導致的誤差;(4)因攝像頭成像亮度重心計算不準確所致的誤差。綜合以上誤差構成了系統的整體誤差,可通過對各種誤差進行分析和矯正來解決,但這種處理方法煩瑣、工作量大。本研究采用簡單的回歸分析法對系統進行定標和校準。
定標方案:將水下魚體激光測距系統靜止置于水箱中的一側,取固定長度為1 m的矩形標定板水平置于水箱底部,開啟攝像頭和激光器并調整激光線角度與矩形標定板上的刻度線水平平行,使用卷尺測量矩形標定板到激光端面的距離,并拍攝這時激光照射在標定板上的成像,形成一條紅色的亮線如圖3所示。

圖3 激光照射在標定板上的成像
由遠及近的開始定標,為了能夠采集更多的標定數據,過程中每間隔2 cm拍攝一張圖片,在量程51 cm至147 cm中共拍攝了49張圖片,并確保了測距的誤差將會在2 cm內。
對定標過程中錄制的視頻利用Pot Player 播放器的連續幀采集功能獲取截圖[27],從中人工篩選出清晰可見的每間隔2 cm的標定板照片。對每張照片建立平面直角坐標系xoy,取圖片的左上角為原點o,水平向右方向為y軸,豎直向下方向為x軸。根據采集的光線重心坐標與矩形標定板到激光端面的距離關系,可以得出光線的重心坐標在x軸上是隨著矩形標定板距離激光端面的距離越近而越小的。由此可以根據已知水平激光直線距離與圖像點坐標匹配分析得出其非線性回歸的關系[28]。
試驗中攝像頭分辨率為2 560×1 480像素,在不影響回歸精度的前提下,適當減少了采樣點的數量[29],即采樣點并不包括激光線上所有的點,而是每個采樣點間有一定的間隔(10,20,30,…,100 cm),并且挑選圖像清晰的點得出他們在豎直向下方向x軸的坐標,并選擇坐標的中位數作為在此距離下x軸的坐標。其坐標單位為像素數,分別找到各個像點對應光點在實際中與激光端面的距離S即前面提到的N點的空間坐標XN,采用一元多項式回歸模型:
S=anxn+an-1xn-1+,...,+a2x2+a1x+a0
(7)
擬合出S與像點坐標x的關系,至此完成系統的定標與校準。
所使用的相機為哈克思特HK90A高清水下網絡攝像機,可以清晰拍攝水中物體影像。但拍攝的圖像中會出現畸變,為保證圖像尺寸和比例關系的真實性,在圖像處理過程中需要先對這些畸變進行矯正。本研究選擇張正友標定法[30-31],它是一種常用的相機標定方法,可以用來計算相機內參、畸變參數和外參等相機參數。當這些參數已知時,可以使用它們來矯正照片,使得照片中的圖像符合實際物體的尺寸和比例關系。
使用張正友標定法矯正照片的方案如下:
(1)拍攝棋盤格照片:需要準備一張使用黑白格子組合起來的棋盤格,置于試驗的水箱中,并在不同的角度和不同的距離下拍攝多張照片,確保照片中棋盤格占據不同比例的圖案。
(2)提取角點:通過角點檢測算法檢測出每張圖片中棋盤格的角點,利用這些角點可以得到對應的像素坐標。
(3)標定相機:使用檢測到的角點和已知的棋盤格尺寸進行相機的標定,即通過張正友標定法來求解相機的內部參數矩陣和畸變參數。
(4)矯正照片:首先使用標定得到的相機參數來矯正棋盤格照片中的畸變,使得棋盤格的每個方格都恢復原始的大小和比例關系,確保矯正效果。再應用到本試驗中的其他照片上,從而將照片中的物體大小和比例關系恢復到實際場景的大小和比例關系。
在進行魚體測距時最大的誤差在于水下激光照射到魚體表面發生的亮線展寬現象,激光照射到魚體表面的成像不是一條細線,而是具有一定的寬度。這是由于反射光強導致的成像 CCD 飽和所致[32]。顏色較深的魚體表面反射較弱,激光照射在魚體表面將呈現出一條清晰可見寬度均勻的激光線條。而當激光照射在魚體顏色較淺的魚體表面上,反射光較強,導致成像展寬,激光輪廓的重心將很難準確地識別[33],此時會產生比較大的誤差。為此本研究對魚體表面激光的重心提取步驟如下:
(1)載入清晰可見激光照射魚體表面的圖片。
(2)提取二值圖像:本試驗所采用的激光為波長638 nm的紅色激光,首先需要使用圖像處理算法提取圖像的綠色通道,此時紅色激光輪廓更加明顯,進一步使用cv2.threshold函對圖像進行閾值分割,得到紅色激光輪廓的二值圖像。如圖4所示。

圖4 激光輪廓識別圖
(3)縮小輪廓區域:對于步驟(2)得到的二值圖像有紅色激光線條的輪廓也有散射激光形成的亮斑,需逐步縮小激光線條的輪廓大小。首先對步驟(2)提取出的輪廓提取亮度通道v_channel,計算出每個小輪廓的平均亮度,并以圖像平均亮度為閾值,篩選出平均亮度大于圖像平均亮度的小輪廓,并過濾去面積小于50個像素面積的小輪廓,去除了具有明顯干擾的小斑點。再對輪廓進行最小二乘法擬合,計算出輪廓特征直線的參數,然后根據點到直線的距離公式計算出輪廓中所有點到擬合出的直線的距離,并計算出平均距離。最后去除點到直線的距離大于平均距離的像素點,剩余的像素點構成新的輪廓。如圖4識別出的激光亮線所示,此時的輪廓用綠線標記。
(4)基于亮度分布計算激光線條的重心:首先遍歷激光輪廓的每個像素點坐標計算出輪廓的每一列像素的上下界值以確定j和n。再按列計算每列的重心坐標l,每列內的像素數值即為亮度gj,列內像素縱坐標為lj,然后利用重心公式(8)計算加權平均數以得到每列的重心坐標l。
(8)
如圖4計算的亮線重心所示此時計算得出的重心包含了魚體身上的多個重心以及未照射在魚體上的亮線重心,可將非魚體身上亮線的重心坐標設為閾值僅保留魚體上的亮線重心。
綜上所述,本研究的基于線激光三角法的魚體測距系統的整體架構如圖5所示。

圖5 魚體測距整體架構
首先根據水下拍攝的各種角度和不同距離的張正友標定板照片進行照片的畸變校正,獲得本次試驗所使用的兩個工業攝像頭的相機內參和畸變參數。將獲得的相機內參和畸變參數代入到需要矯正的照片中,使照片中的魚體和線激光線條的大小和關系都恢復到實際場景的大小和比例關系。矯正前后的結果如圖6所示。

圖6 圖像矯正前后對比
將矯正后每間隔 2 cm的標定板照片進行提取對應距離下的激光亮線的坐標,使用多項式非線性回歸分析并擬合出距離與像素坐標的曲線系數。多項式回歸的本質是將一個低維空間里的數據集通過非線性變換映射到一個高維空間中,從而給線性回歸提供更豐富的特征信息。因此,本研究在訓練集中,通過多項式函數對自變量進行轉換,將低維映射到高維,然后對新的自變量和因變量擬合線性模型。通過sklearn.preprocessing中的Polynomial Features來實現這一操作,激光亮斑的像素坐標與距離正相關。激光測距曲線如圖7所示。

圖7 激光測距曲線圖
為提高激光測距精度,需要確定一元多項式的最優階數[33]。為此本研究選擇了多次迭代多項式回歸模型,可以通過增大多項式的階數來實現。在每次迭代中,將上一次得到的模型作為初始模型,使用更高階數的多項式回歸模型擬合數據,并更新模型參數。重復進行多次迭代,可以得到不同階數的多項式回歸模型,還在每次迭代后可視化了模型擬合結果。不同階數的擬合結果如圖8所示。

圖8 不同階數的擬合結果
通過比較不同階數下的預測結果,可以判斷模型在數據上是否出現欠擬合或過擬合現象。從而找到適合我們的多項式階數。從圖 8 來看,3 階到 5 階的擬合結果接近,6階7階在近距離下的擬合結果不佳,具有明顯誤差。不同階數時的具體誤差分析,如表1所示。

表1 不同階數的誤差分析
從表1中的數據可以看出當多項式階數為5時,平均誤差和方差最低,平均誤差僅有5.654 mm,故本研究選擇一元五階多項式(9)來預測激光距離。
S=a5x5+a4x4+a3x3+a2x2+a1x+a0
(9)
針對魚體測距本研究通過標定所擬合得到的激光距離與圖像像素點坐標的非線性回歸公式計算出魚體與激光器的距離。對魚體身上的激光輪廓重心識別部分結果如圖9所示。

圖9 魚體重心識別結果

圖10 魚體表面激光相鄰列重心坐標關系圖
由圖9可見激光散射所識別出的線激光輪廓并不連續,但在魚體表面上的激光均能識別出部分輪廓,對識別出的輪廓計算每列的重心,并將重心在圖像中以藍色圓點標記出來。這些重心的像素坐標都可以進行測距,得出魚體的不同部位的距離。通過分析圖9D魚體相鄰列的重心坐標大小關系如圖 10 所示。
X為列數,Y為對應列的重心坐標,以像素為單位。總共的列數為 351 列,識別出的最大值為314,最小值295,可見差值最大為19個像素,通過分析得出 91.7%的相鄰列重心坐標差值在5像素內。由上圖可見重心坐標往增大趨勢,反映了魚體由前往后變遠的趨勢。
由于魚在水下環境中不斷游動將很難測出實際的魚體距離,故本研究采用標定板在水下不同的位置來驗證魚體測距系統預測的準確性。利用前面提到的(9)式來計算激光端面到標定板的距離,根據標定所拍圖像得出了上攝像頭的一元五次多項式回歸的系數,a5=1.542 972 25×10-14,a4=4.547 337 69×10-11,a3=3.520 692 02×10-8,a2=2.486 386 20×10-5,a1=5.362 824 03×10-2,a0=49.966 213 855。確定回歸系數后,將被測物的圖像上的激光輪廓重心坐標代入(9)式即可計算出距離,驗證測量精度,見表2。從表2可以看出,隨機選取的56~92 cm內的80%預測結果的誤差都在7.000 mm內,最大的誤差是12.920 mm也都滿足了本研究標定時最大2 cm誤差的要求,胡波等[34]提出的基于圖像的水下三點激光測距方法在2.33 m內的測量誤差高達35 cm,李坤等[12]提出的強度調制532 nm激光水下測距方法在 3 m內誤差為 12 cm,本試驗在量程0.5~1.5 m量程內平均誤差僅為0.56 cm,能夠滿足水下目標較近距離的測量精度要求,且成本低并簡化了測距所需參數,僅需識別水下目標物體重心坐標,代入定標擬合的一元多項式即可計算距離。綜上所述,本研究提出的一元多項式回歸模型是能夠準確地預測水下測距的。

表2 激光測距預測誤差分析
針對傳統的線激光三角法測距原理以及相機成像原理進行深入研究,設計了一種基于線激光三角測距法的魚體測距系統。通過激光亮線照射在被測物身上,為被測物測距提供了大量的特征點,多次標定,簡化了測距需要的參數,僅需像素坐標即可預測距離,使得測距更加簡易,并將其應用于魚體測距上,為魚體測量中的非接觸動態魚體尺寸測量提供更多的思路,而不局限于使用雙目攝像頭獲得魚體三維信息。同時在對圖像提取像素點坐標前,通過張正友標定法獲得了本試驗攝像頭的相機內參和畸變參數,進而將圖片恢復到了一個與實際場景的大小和比例關系相當的水平。識別出了魚體表面的激光亮線,并實現了一種基于亮度分布的重心識別法,計算出了魚體表面激光重心。提取矩形標定板的光斑重心坐標信息與距離的回歸關系,擬合了多個不同階數一元多項式,并分析得到一元五階多項式的平均誤差最低,僅為5.654 mm。最后隨機分析了不同距離下的預測距離的誤差情況,得出結果均滿足標定時所設定的2 cm內,將其應用魚體尺寸測量具有良好的精度,本研究下一步將結合深度學習模型實現動態魚體尺寸測量和種類分析。
□