徐金陽,徐愛俊*,周素茵,葉俊華,夏 芳
(1.浙江農林大學信息工程學院,杭州311300;2.浙江省林業(yè)智能監(jiān)測與信息技術研究重點實驗室,杭州311300;3.浙江農林大學環(huán)境與資源學院,杭州311300;4.浙江農林大學經濟管理學院,杭州311300)
生長和發(fā)育監(jiān)測對生豬養(yǎng)殖至關重要。體尺是衡量生豬生長狀況重要指標[1-2],也是育種、質量預估、肉質評價重要參考依據(jù)[3]。傳統(tǒng)體尺測量需人工接觸,難度大、成本高,同時對豬只產生應激,影響其生長發(fā)育。隨著機器視覺技術發(fā)展日趨成熟,基于該技術的豬體體尺非接觸式測量可大幅減小豬只應激反應,提高生產效率[4]。
傳統(tǒng)相機采集的RGB豬體圖像,易受光照和豬體顏色等因素影響,豬體輪廓提取不準確,導致體尺測量誤差較大[5-6],深度圖像對光照和豬體顏色不敏感,基于深度圖像的豬體體尺測量誤差相對較小。豬只體尺測量包括體尺測點(用于計算豬只體長、體寬和體高的測量點)提取和體尺還原兩個步驟,現(xiàn)有豬只體體尺測點提取算法主要針對豬體背部呈現(xiàn)無彎曲和無歪頭情況,如司永勝等利用深度圖像,通過最小外接矩調整豬體到水平方向,使用影差法和差分法找到豬體體尺測點[7]。Pezzuolo等利用Kinect相機采集豬體點云數(shù)據(jù),通過豬體形態(tài)特征確定體尺測點[8]。Guo等利用LSSA_CAU軟件合成豬體世界點云數(shù)據(jù)進而完成體尺測量[9]。劉同海等利用輪廓和凸包絡線交點獲取頭尾部和肩臀部體尺測點[10]。李卓等結合凸包分析和形態(tài)特征確定體尺測點[11]。豬只脖頸或背部通常呈彎曲狀態(tài)[12-14],導致實際采集圖像與理想圖像存在差異。此外,現(xiàn)有生豬體尺測量算法在還原生豬真實體尺時,通常需利用標定尺輔助得到真實世界與圖像比例關系[15-16],這種體尺還原方式增加圖像采集復雜程度,降低工作效率。現(xiàn)有豬體體尺測量算法存在一定局限性。
針對現(xiàn)有生豬體尺測量算法中存在問題,本文基于Kinect相機采集生豬深度圖像,利用凸包絡和最大外接輪廓提取豬體自然狀態(tài)下體尺測點,通過像素坐標系與世界坐標系變換,得到體尺點真實坐標,實現(xiàn)自然狀態(tài)下豬體體尺高精度測量。
2020年12月,在紹興市新昌縣大市聚新豐規(guī)模養(yǎng)殖場使用Azure Kinect DK深度像機采集長白豬圖像,日齡為120~150 d。圖像大小為640像素×576像素,利用Visual Studio 2020作為編輯軟件處理圖像數(shù)據(jù)。上方相機與地面垂直距離約180 cm,側方相機與豬體側面水平距離約110 cm,采集俯視和側視圖共800張。采集方法如圖1所示。
圖1 數(shù)據(jù)采集方法Fig.1 Data acquisition method
首先對采集目標的深度圖像通過影差法剔除背景信息,增強目標信息;利用動態(tài)閾值分割處理豬體圖像,采用中值模糊濾波多次迭代作去噪處理,最大程度消除噪聲;其次基于形態(tài)學運算和canny算法完成豬體圖像邊界修飾和豬體輪廓提??;最后采用最大外接輪廓和凸包絡、提取體尺測點像素坐標,還原體尺測點三維信息,算法流程如圖2所示。
圖2 豬體輪廓及體尺測點提取算法流程Fig.2 Pig contour and measurement point extraction algorithm flow
豬體頭尾部體尺測點為輪廓頭尾部最大凹陷處,圖3為部分豬體輪廓線,C為頭部體尺測點。首先求得輪廓和凸包絡線交點A、B坐標和直線AB線性方程,計算輪廓線AB上的點到直線AB距離d,當d取最大值時對應輪廓點即為頭部測點C,尾部體尺測點識別算法類同。
圖3 頭部體尺測點提取Fig.3 Head measurement point extraction
由圖3中幾何關系可知,線段AB長度計算公式為:
式中,A點坐標為(xA,yA),B點坐標為(xB,yB)。
直線AB在二維坐標系下方程一般式為:
式中,a、b、c為常數(shù),-a/b表示直線斜率。點(x,y)表示直線AB上任意一點的坐標。通過A點和B點坐標求得a、b和c的值。
輪廓線上點到直線AB的距離d計算公式為:
式中,(x',y')為輪廓線AB上任意一點坐標,通過在規(guī)定區(qū)間內,求出最大值的距離dmax和對應體尺測點C坐標。
確定頭尾部測點后,利用最大外接輪廓,獲取豬體彎曲狀態(tài)下肩臀部和體高體尺測點。以提取肩部體尺測點W為例說明,圖4a為豬體背部最大外接輪廓,采用差值法和曲率法識別體尺測點,具體如下。
圖4 肩部體尺測點提取Fig.4 Shoulder measurement point extraction
首先把靠近體尺測點W的最大外接輪廓邊界作為基準值,對基準值和其水平對應輪廓點做差值計算,差值Di計算公式為:
式中,(xi,yi)為輪廓點坐標,(xbase,ybase)為基準值坐標,i和base取值為1,2,3,…,n。
以頭尾部體尺測點為邊界,通過式(4)計算,得到4b差值函數(shù)曲線y(Di)。由豬形態(tài)學知識可知,其臀部和肩部相對凸起,因此通過輪廓差值曲線曲率可求得體尺測點。差值函數(shù)曲率計算公式為:
式中,y'(Di)為差值函數(shù)上點的斜率,y''(Di)為差值函數(shù)y'(Di)的導數(shù)。
綜上可知,差值函數(shù)曲線上兩處曲率最小值分別是一側肩部和臀部的體尺測點,點W即為肩部對應體尺測點,臀部和體高測點算法類同。
在提取體尺測點坐標基礎上,通過體尺還原算法得到豬只真實體尺,算法流程如圖5所示。
圖5 體尺還原算法流程Fig.5 Flow of body size restore algorithm
豬只體尺測點從像素坐標系轉換到世界坐標系的原理如圖6所示,轉換公式如式(7)所示。
圖6 體尺還原算法原理Fig.6 Schematic diagram of body size restore algorithm
式中,(u,v)為像素平面中點的坐標,dx和dy為感光芯片上像素的實際大小,ZC為相機坐標系下點的深度距離,f是相機的焦距,R為3×3矩陣,t為3×1,0為1×3矩陣。
完成體尺測點從像素坐標系到世界坐標系的轉換后,使用歐式距離公式計算豬只真實體尺,計算示意圖如7所示。體長是從耳根中點沿背部脊梁經肩部中點、臀部中點到尾根中點距離,體高為肩胛骨頂點到水平底面的垂直距離,肩寬為兩側肩部頂點距離,臀寬為兩側臀部頂點距離。
在動態(tài)閾值分割和形態(tài)學修飾基礎上,利用canny算法、凸包絡和最大外接輪廓算法分別提取豬只輪廓、凸包絡和最大外接輪廓,結果如圖8所示。
圖7 豬彎曲體尺測量Fig.7 Pig bending size measurement
圖8 體尺測點提取Fig.8 Body size measurement point extraction
實驗場地豬只各測點提取的坐標值如表1所示。在提取測點坐標值基礎上,可進一步通過歐式距離公式計算豬只體尺。
表1 提取體尺測點坐標值Table 1 Extract the coordinate value of the measuring point of the body size
分析計算現(xiàn)場采集的800張生豬圖片可知豬體彎曲弧度范圍一般為0°~40°。為研究本文彎曲體尺測點算法提取的魯棒性和精度,隨機采集養(yǎng)殖場中品種相同、生長狀況類似的20頭長白豬的圖像,每頭豬在不同彎曲弧度(0°~10°、10°~20°、20°~30°、30°~40°)范圍內共800張圖片。
3.2.1 魯棒性驗證
圖9 為隨機選取不同位置和不同角度的6幅生豬深度圖像及體尺測點提取結果,試驗結果表明,該算法能準確提取豬體不同彎曲弧度下體尺測點,測點提取成功率為100%。
圖9 不同方位和彎曲狀態(tài)體尺測點提取效果Fig.9 Extraction effect of measurement points in different azimuths and bending states
3.2.2精度驗證
首先通過皮尺和米尺測量豬體體尺數(shù)據(jù),測量點位置和體尺算法提取的測點位置相同,實際測量其體長、肩寬、臀寬和體高各3次,取平均值作為實測值。利用本文測量方法得到測量值與實測值相對誤差見圖10。由圖10可知,本文方法測得的體尺中,肩寬測量精確度較高,其最大、最小相對誤差分別為5.03%和0.43%,平均相對誤差為1.92%;臀寬最大、最小相對誤差分別為5.45%和0.71%,平均相對誤差為2.00%;體高最大、最小相對誤差分別為6.10%和0.69%,平均相對誤差為2.64%;體長測量誤差較大,其最大、最小相對誤差分別為5.12%和0.77%,平均相對誤差為2.93%。豬只不同彎曲弧度下體尺測量相對誤差見表2。
圖10 豬不同彎曲狀態(tài)體尺實測值和測量值相對誤差Fig.10 Relative error between field measured and measured body size of pigs in different bending states
表2 豬不同彎曲狀體尺測量相對誤差Table 2 Relative error of measuring different curved body size of pigs
隨機選取20頭長白豬各10張不同角度的筆直狀圖片共200張,分別計算本文方法和國內外其他方法豬體體尺測量方法的精確度,取平均值作為測量值,結果見圖11。
由圖11中試驗數(shù)據(jù)可知,本方法測量精確度較高,體長、肩臀寬和體高相對誤差分別為2.33%、1.29%、1.26%和1.92%;方法3測量精確度次之,體長、肩臀寬和體高相對誤差分別為2.15%、2.95%、2.36%和1.53%;方法5體長、肩臀寬和體高相對誤差分別為2.60%、3.09%、2.99%和3.17%;方法2體長、肩臀寬和體高的相對誤差分別為2.87%、3.86%、4.15%和3.72%;方法1體長、肩臀寬的相對誤差分別為2.76%、3.64%和4.20%;方法4測量精確度較低,體長、肩臀寬和體高相對誤差分別為3.21%、5.95%、5.97%和6.00%。
采用凸包絡和最大外接輪廓提取豬彎曲狀態(tài)下的體尺測點,提取成功率為100%。根據(jù)提取的體尺測點提出一種基于深度信息和坐標系變換的豬體尺還原算法,無需標定尺,即可較為準確地還原豬體尺。豬體非彎曲狀態(tài)下體尺測量結果表明,本文方法精確度總體較高,在4個體尺指標中,肩寬和臀寬測量精確度明顯優(yōu)于現(xiàn)有測量方法;體長和體高測量精度與現(xiàn)有測量方法相差較小。豬體不同彎曲弧度(0°~40°)下測量結果表明,肩寬測量誤差較小,平均相對誤差不高于1.92%;臀寬和體高平均相對誤差分別不高于2.00%和2.64%;體長測量誤差較大,平均相對誤差不高于2.93%。綜上,該方法適用于豬自然狀態(tài)下體尺測量,尤其是對彎曲體尺測量效果較好,滿足生豬實際生長監(jiān)測需要。
本文對豬體肩臀部測量相對誤差較低,可能是獲取體尺測點深度信息時肩臀部測點離相機中心相較近;彎曲體尺測量需將把豬體按骨架分成若干段,測量誤差隨豬體彎曲弧度(0°~40°)的增加而增大,但在可接受范圍內。