司永勝 安露露 劉 剛 李保成
(1.河北農業大學信息科學與技術學院, 保定 071001; 2.中國農業大學現代精細農業系統集成研究教育部重點實驗室,北京 100083; 3.中國農業大學農業部農業信息獲取技術重點實驗室, 北京 100083)
豬的體尺參數能夠反映豬的生長發育狀況,可作為衡量豬生長發育情況的一個主要指標。在種豬選育、肉質評價以及飼養管理等方面,豬體體尺也是一個重要指標[1-3]。傳統的體尺測量多采用接觸式測量方法,一般用皮尺進行手工測量。這種傳統的測量方法直接接觸豬體,測量難度大,誤差也較大,易使豬體受到刺激,影響其生長發育[4-6]。通過機器視覺技術可以實現無接觸豬體尺的測量,減少豬體的應激,提高測量效率[7]。
利用機器視覺技術測量動物體尺已有較多研究,取得了較大的進展[4-10]。眾多利用機器視覺技術測量豬體尺的研究中,都是對靜態圖像進行處理[5,7]。基于單幀靜態圖像進行豬體尺測量,對采集的圖像要求較高,要求圖像中豬體完整,無歪頭、低頭現象,背部呈筆直狀、無彎曲[5,11-12]。在實際圖像采集過程中,由于豬的采食習性和爭斗習性,很難采集到滿足測量要求的理想圖像,因此制約了利用機器視覺技術進行豬體體尺測量的應用。此外,利用傳統彩色相機進行豬體尺測量時,受環境和光線影響,豬體上的臟污和地面高光物體容易造成目標輪廓提取錯誤[7],會增大體尺測量誤差。Kinect相機(微軟公司)可以輸出深度視頻數據。將深度視頻數據轉換為深度圖像序列,深度圖像可有效避免因背景和目標顏色接近而造成的目標識別錯誤[13-14]。
本文采用Kinect相機采集視頻數據,設計豬體姿態檢測算法,從視頻中篩選符合體尺測量的理想姿態圖像幀(以下簡稱理想姿態幀)。在此基礎上,設計一種豬體體尺測量算法。
實驗數據采集自北京天鵬興旺養殖有限公司的規模養豬場和唐山市遷西縣太平寨養豬場,豬品種為長白豬和大白豬,豬齡約為60、150、180 d。如圖1所示,在豬的采食飲水區和休息區之間安裝利用鐵欄桿搭建的生豬通道,生豬通道入口處安裝有無線射頻識別(RFID)裝置,豬的耳部裝有RFID耳標,當豬進入通道后,RFID識別裝置可識別豬的身份,并將其與采集到的視頻數據進行對應。通道的入口和出口設計為只允許單向通過。通道的上方和側方各安裝有一臺Kinect相機,分別采集豬的俯視圖和側視圖,以便測量豬的體長、體寬、體高等體尺參數。上方相機安裝點距離地面約170 cm。側方相機距離通道約110 cm。數據分兩次采集,共采集103頭豬的103組視頻數據,俯視和側視視頻各52 016幀,視頻的分辨率為512像素×424像素,幀率為30幀/s。

圖1 豬體尺測量系統平臺Fig.1 Platform for body size measurement of pigs1、3.Kinect相機 2.生豬通道
數據的處理與分析采用Matlab 2017a軟件。依次提取視頻中圖像幀,選取圖像中欄桿內部區域為興趣區,裁剪興趣區的圖像,進行差影法計算并將其轉換為二值圖像,利用最小外接矩形法[15]將豬體調整到水平方向。利用投影法識別豬的頭部位置,利用標記法和骨骼化結合霍夫變換檢測耳部是否缺失及頭部是否歪斜,篩選出理想姿態幀。基于理想姿態幀,進行體尺測量。
理想姿態幀的檢測算法如圖2所示。采集視頻數據過程中,豬體只在欄桿內部區域出現,為提高處理速度,將每幀圖像中欄桿內部區域設定為興趣區,只對興趣區的圖像進行處理。在通道內沒有豬時拍攝一幀圖像,作為背景幀,然后將視頻數據中的每幀圖像依次與背景幀采用差影法進行豬體識別。在豬體高度處放置一標準長度鋼尺,用于算法測量時像素長度轉換。利用Otsu法對差影法后的圖像進行二值化處理,得到以豬體為目標的二值圖像。

圖2 理想姿態幀檢測流程圖Fig.2 Flow chart of ideal posture frame detection
為了方便豬的通過,生豬通道寬度大于豬的體寬,俯視圖像中的豬體常呈傾斜狀態。為降低后期對耳根、尾根等部位檢測難度,采用最小外接矩形法檢測豬體的水平狀態,并將傾斜豬體調整為水平方向。
對含有豬體的二值圖像提取邊界并計算邊界像素點的凸包多邊形,設凸包多邊形有n條邊,各邊端點坐標為(xt,yt) ,t=1,2,…,n。
具體求解最小外接矩形的步驟如下:
(1)任意選取豬體輪廓凸多邊形的一條邊,設該邊的端點為T0(x1,y1)、T1(x2,y2)。計算線段T0T1與X軸之間的角度,定義其為邊角θ。以左端點T0為中心順時針旋轉該多邊形θ,使邊T0T1平行于X軸,邊角θ計算式為
(1)
(2)假設凸多邊形上各邊端點坐標(xt,yt)順時針旋轉θ后,點的坐標為(x′t,y′t),旋轉公式為
(2)
(3)根據所求旋轉后的各邊端點坐標,得到凸多邊形頂點的最小坐標值(Xmin和Ymin)和最大坐標值(Xmax和Ymax),即
(3)
最大坐標值和最小坐標值確定的4個點構成一個矩形,即(Xmin,Ymin)、(Xmin,Ymax)、(Xmax,Ymax)、(Xmax,Ymin) 4點確定一個矩形,計算此矩形的面積。
(4)選擇凸包多邊形的下一條邊,重復上述步驟,直到凸包多邊形的所有邊都執行完畢,得到n個矩形。
(5)比較n個矩形的面積,將面積最小的矩形逆時針旋轉,旋轉角與凸多邊形旋轉的邊角相同。逆時針旋轉后的矩形即為所求最小外接矩形。
獲取最小外接矩形后,容易計算俯視圖像中的豬體水平角度。如圖3a所示,如果水平角度大于1°,則對此圖像進行相應旋轉,將其調整為水平,如圖3b所示。

圖3 最小外接矩形法調整豬體為水平Fig.3 Adjusting pig to level by minimum bounding rectangle
豬體長通常為耳根中心到尾根中心的長度[1]。由于豬低頭或歪頭等行為,造成部分圖像幀中耳部缺失或位置偏斜,不適宜體尺測量,需要忽略這些圖像幀,為此需要首先檢測豬的頭部位置[16]。
本文采用投影法和差分法進行豬脖頸、頭部和尾部的識別,具體如下:
將豬體調整為水平圖像的像素沿水平方向進行垂直投影

(4)
式中h——圖像垂直方向的寬度
M——圖像水平方向的寬度
I(i,j)——圖像中(i,j)坐標處的像素灰度
通過式(4)計算,得到圖4中的藍色曲線。從豬體中心到耳部范圍內,投影曲線最小值處為脖頸。一般情況下,在投影曲線上,耳部取得最大值,但由于存在豬歪頭情況,以此進行判斷可靠性較差。本文對投影曲線進行差分計算
Sd(j)=S(j+3)-S(j)
(j=1,2,…,M-3)
(5)

圖4 投影曲線(藍)和差分曲線(紅)Fig.4 Projection curve (blue) and differential curve (red)
得到圖4中的紅色曲線,從豬體中心到豬頭部,差分曲線在脖頸和耳根結合部分取得最大值。在從豬體中心到脖頸和耳根結合部分的范圍內,搜索投影曲線的最小值點,得到脖頸位置。脖頸以右的圖像即為頭部圖像。為獲得完整的頭部圖像,將上述方法獲得的脖頸位置向左移動30像素,作為脖頸位置。此外,從軀干中心到尾部范圍內,紅色的差分曲線在尾根位置取得最大值。
體尺測量需要頭部和軀干保持一條直線[17],避免存在耳部缺失或頭部歪斜等情況。若豬體頭部出現歪頭、頭部被遮擋情況,會造成此幀圖像不適宜體尺測量[18]。體長的測量關鍵是需要檢測耳根和尾根的位置,如果耳部缺失,則難以測量體長。本文提出了頭部邊界標記的算法,來判斷豬體是否耳部缺失,利用骨骼化提取豬體主線的方法判斷豬頭部是否歪斜。
2.3.1耳部缺失檢測
體長測量需要圖像中兩個耳部完整。獲取豬的頭部圖像后,提取豬頭部圖像的輪廓,如圖5a所示。在頭部輪廓圖像中,利用標記法將豬頭部輪廓圖像轉換為函數圖像:以豬頸部連線中點O點為起點,分別計算該點到圖像邊緣各個像素的距離,以像素的順序為橫坐標,以豬頸部連線中點到邊緣各個像素的距離為縱坐標,將二維邊界轉換為一維函數,如圖5b中藍色曲線。根據圖像尺寸,選取適當閾值(本文選取60像素),將一維距離函數轉換為矩形波。標準豬頭圖像呈3個波峰。在豬低頭時,圖像中鼻子部分會減小,在轉換為矩形波時,中間的高電平部分會較窄甚至消失,而兩側的高電平寬度以及兩側高電平之間的距離變化較小。因此,采用下述條件判斷圖像中耳部是否有缺失:①頭部輪廓的矩形波含有2個或3個高電平。②兩側高電平間距離為80~120像素。③兩側高電平寬度為30~65像素。

圖5 耳部缺失檢測Fig.5 Detection of partial loss of ears
當滿足全部上述條件時,則判斷耳部完整,否則存在耳部缺失,不適宜體長測量。
2.3.2頭部歪斜檢測
剔除豬耳部缺失的圖像后,還需要保證豬頭部和軀干保持直線,為此需要檢測豬頭部歪斜情況。首先對豬體圖像骨骼化處理,然后進行剪枝,最后利用霍夫變換判別頭部是否歪斜。骨骼化算法用于表示平面區域結構形狀,是一種細化結構的方法,是對目標的一種拓撲描述[19]。F的骨架可以表達為
(6)
其中
SKr(F)=(FΘrG)-(FΘrG)°G
R=max{r|(FΘrG)≠?}
式中F——二值圖像 °——開運算
G——一個結構元素
(FΘrG)表示對F的連續r次腐蝕
(FΘrG)=(…((FΘG)ΘG)Θ…)ΘG
第r次是F被腐蝕為空集合前進行的最后一次迭代。
對圖6a和圖6b的理想姿態圖像和歪斜圖像進行骨骼化處理后,分別得到圖6c和圖6d的骨骼化圖像。骨骼化后的圖像中存在毛刺,需要對骨骼化圖像進行剪枝處理[20-21],最終得到豬體主線。采用的剪枝算法如下:①搜索骨架的所有分支端點,刪除所有端點。②設定循環次數q,重復步驟①q次。
循環次數需要根據圖像中毛刺長短進行設定,本文中毛刺長35像素,即大部分毛刺小于35像素。上述剪枝算法會對主線也進行相應縮短,但不影響后期霍夫變換直線檢測的應用。
剪枝后的圖像如圖6e、6f所示。剪枝后的骨架表征了豬體的基本姿態,以肩部與脖頸的連接處為分界點,將豬骨架分為左右兩部分,左邊的軀干部分和右邊的脖頸部分。如果豬頭部歪斜,左右兩部分的骨架有較大角度,否則二者近似在一條直線上。尋找肩部與脖頸連接處分界點方法如下:首先在剪枝后骨架中找到肩部點(軀干中部到脖頸之間,投影曲線上最大值處為肩部),然后連接肩部點與頭部中心成一線段,取線段中心偏左10個像素,作為分界點。對其左右兩部分骨架像素分別進行霍夫變換(Hough transform)的直線檢測。右部分骨架中在剪枝后還存在由于耳部等形成的毛刺,為避免其干擾,在右側骨架中尋找最左側的節點,取該節點左側骨架像素進行霍夫變換直線檢測。頭部挺直及歪斜的圖像直線提取效果如圖6e、6f所示。兩直線夾角大于10°時,表明豬頭部歪斜,不適宜進行體尺測量。

圖6 豬頭部歪斜檢測Fig.6 Skew detection of pig head
體長測量需首先找到耳根和尾根的精確位置[18]。
以豬頭部圖像的中心為原點,水平方向和垂直方向為兩個坐標軸建立坐標系,在第2象限和第3象限分別檢測到原點距離最近的邊緣點,分別為兩個耳根位置點,如圖7a所示。
以豬體中心為左右分界點,圖4中差分曲線在圖像左側取得最大值處為尾根大致位置。設該處的橫坐標為x3,作直線x=x3, 該直線與豬體輪廓交于兩點A和B。A、B兩點不是精確的尾根位置。經過AB中心點C,作一水平線,在水平線上C點右側找到一點D,使
(7)
式中lCD、lAB——線段CD、AB的長度
以D點為原點,在第2象限和第3象限分別檢測距離原點最近的邊緣點,分別為兩個尾根位置點,如圖7b所示。連接尾根和耳根的中心,可得到豬的體長。體寬為肩胛骨頂點處豬體的寬度[1]。在豬體中心到脖頸的范圍內,投影曲線在肩部取得最大值。設該處的橫坐標為x4,獲取直線x=x4,該直線與豬體輪廓交于兩點,該兩點間的距離為體寬。

圖7 耳根尾根位置示意圖Fig.7 Detection sketch of ear root and tail root
體高一般是測量肩胛骨頂點垂直地面的高度[1]。檢測到豬體理想姿態幀,選擇與俯視圖對應的側視圖進行體高測量,選取通道區域為圖像興趣區,用自動迭代選擇閾值法對圖像進行閾值分割[19],獲得檢測出目標的二值圖像。對二值圖像采用開運算去除邊緣不規則部分,并填充孔洞,最后根據面積信息去噪,清除小于300像素的噪聲,得到圖像如圖8a所示。考慮到豬體不一定與拍攝平面平行,因此,測量的地面基準線由豬前、后兩只腳的連線確定[22]。肩胛骨頂點位置確定方法如下:利用投影法搜索從豬頭部到豬體中心范圍內投影曲線的最大值處,對應的輪廓點即為肩胛骨頂點,然后計算肩胛骨頂點到地面的距離,即為豬的體高。
最終得到的體高、體長、體寬測量結果如圖8所示。

圖8 體尺測量結果Fig.8 Measurement results of body size
利用上述算法,對103組視頻的52 016幀俯視、側視圖像是否適宜體尺測量進行了自動檢測。為檢驗篩選效果,對上述圖像進行了人工篩選,耳根、尾根位置清晰、頭頸部沒有明顯彎曲則認為適宜體尺測量,否則認為不適宜。將人工篩選結果作為真實值,如果某幀圖像人工篩選為理想姿態幀,而算法篩選為不適宜測量,則為漏報,反之則為誤報。如表1所示,為方便統計,依據豬的品種及生長天數,將103頭豬的視頻數據分為5類:長白豬60 d、長白豬150 d、大白豬150 d、長白豬180 d和大白豬180 d。總幀數包括算法篩選理想姿態幀和算法篩選非理想姿態幀,算法篩選理想姿態幀共2 592幀,占總幀數52 016幀的4.98%,比例較小,其余49 424幀由于豬體不完整、頭部歪斜和耳部缺失原因被算法篩選為非理想姿態幀,適宜測量的理想姿態幀占比例很小,也說明了設計理想姿態檢測算法的必要性。算法共篩選出理想姿態幀2 592幀,而人工檢測為3 024幀,漏報共計432幀,誤報幀數為0幀。漏報幀屬于算法非理想姿態幀分類,對漏報的圖像幀進行分析,出現漏報的主要原因是這些圖像幀中耳根部位清晰,但耳部受遮擋或噪聲影響,輪廓不完整,在利用耳部輪廓矩形波法檢測過程中被判定為不適宜檢測幀。這種情況下出現漏報是由于算法本身的局限性。另外有3、4幀漏報是由于豬的頭部歪斜11°左右,人工篩選認為可以測量,而算法將其歸類為非理想檢測幀。視頻數據中,有部分理想姿態幀即可進行體尺測量,因此,相對于誤報,漏報的危害性較小。誤報將非理想姿態幀判別為理想姿態幀,會加大體尺測量誤差,103組視頻數據的測試中均未出現誤報現象。
所有的理想姿態幀均可進行體尺測量,但理想姿態幀的選取策略將影響體尺測量效果。理想姿態幀的選取策略,取決于同組理想姿態幀之間的差異性。如果同組理想姿態幀之間差異過大,將增加理想姿態幀選取難度。為對比每組理想姿態幀之間的差異,按表1中的視頻數據分類方法,對103組理想姿態幀圖像進行了體長算法測量,并計算了體長絕對偏差。體長絕對偏差為單幀測量值與本組測量均值的差值。
利用箱線圖對體長絕對偏差進行分析,103組體長絕對偏差的箱線圖如圖9所示。

表1 理想姿態幀檢測結果Tab.1 Ideal posture frames detection results 幀
由圖9可知,每幀圖像的體長絕對偏差絕大部分小于6像素。5類數據中,同一組視頻內,最大值和最小值的差值小于10像素,即測得的最大體長與最小體長差值約為10像素。在圖像幀中,60、150、180 d豬齡的體長測量均值分別在262~324像素、331~390像素、363~428像素范圍內,因此,3種不同豬齡圖像的體長偏差與本組均值的百分比分別小于2.3%、1.8%和1.7%,同組內測得的體長最大值和最小值差異占體長均值的百分比分別小于3.8%、3.0%和2.8%。隨著豬齡的增長,每幀圖像的體長偏差與本組均值的百分比以及同組內體長最大最小值差異占體長均值的百分比均略有減小,可能原因是較小豬齡的豬應激性較大,外界的干擾更容易影響圖像質量。但從總體上說,測量結果的一致性較好。
測量結果良好的一致性一方面說明了姿態檢測算法篩選出的理想姿態幀之間差異性較小,也驗證了體長測量算法的有效性。部分組內數據差異非常小,低于5像素,如圖9a中的第4、14、15組,圖9b中的第20組,圖9c中的第13組,圖9d中第5、8、15組,圖9e中的第15組,上述組內數據差異小的主要原因是部分組內理想姿態幀較少,且時間間隔非常近,各圖像幀間差異很小,另外一個原因是豬經過通道在理想姿態時有停頓,拍攝到多幅類似的理想幀圖像。圖9a、9c、9d、9e中,有6組數據出現了異常值,其中5組異常值較小,小于6像素,可以忽略,圖9a中的第7組異常值產生的主要原因是該幀圖像中豬的尾部甩動,尾部與臀部結合在一起,造成尾根位置檢測不準確。

圖9 體長絕對偏差箱線圖Fig.9 Boxplot of body length absolute deviation
為驗證體尺測量算法的精確度,在采集視頻數據后,采用測杖和皮尺等工具手工測量了對應豬體的體長、體寬和體高數據。為減小誤差,體長、體寬、體高數據手工測量3次,取平均值作為測量值。利用本文算法對篩選出的理想姿態幀進行了體尺測量,取每組平均值為算法測量值。將手工測量值作為真實值,計算了利用103組視頻數據的算法測量值的測量精確度。體尺算法測量精確度如圖10所示。在103組數據中,只有5組體長精確度低于95%,其余的體長精確度都高于95%,體長的精確度高于體寬和體高精確度,主要原因是相對于肩胛骨處的體寬測量點和體高測量點,體長測量中的耳根和尾根位置更容易確定。體高測量的最低和最高精確度分別為92.3%和99.9%,平均精確度為96.3%。體寬測量的最低和最高精確度分別為91.7%和99.9%,平均精確度為95.5%。體長測量的最低和最高精確度分別為93.3%和99.9%,平均精確度為97.3%。由圖10可看出,最低精確度的測量數據為體寬測量值,且有多組體寬精確度接近最低精確度,表明體寬測量難度大于其他兩項指標。

圖10 體尺測量精確度Fig.10 Measurement accuracy of body size
(1)為降低姿態檢測難度,采用最小外接矩形法檢測豬體的水平狀態,并將傾斜豬體根據最小外接矩形的傾斜角度自動調整為水平方向。
(2)對于已經調整水平的豬體,提出了投影法和差分法識別豬脖頸、頭部和尾部位置。
(3)關于豬的姿態檢測,提出頭部邊界標記的算法判斷豬是否耳部缺失,利用骨骼化提取豬體的主線并結合霍夫變換的算法判斷豬頭部是否歪斜。利用103組視頻、52 016幀俯視和側視圖像進行測試,檢測出理想姿態2 592幀、漏報432幀、誤報0幀,漏報率略高,但誤報率為0。同組理想幀之間差異較小。
(4)提出的體長、體寬和體高測量算法,經與手工測量數據對比,體長測量的平均精確度為97.3%,體寬的平均精確度為95.5%,體高的平均精確度為96.3%,測量的精確度較高。