易煥銀,劉志明,覃明俊
(廣東交通職業技術學院機電工程系,廣東廣州510800)
壓縮彈簧在各類彈簧中應用最為廣泛,號稱“簧中王”,在很多機構中擔負關鍵任務[1]。對各類目標的參數檢測是機器視覺的一個重要研究方向[2],關于彈簧這一零件的機器視覺檢測,文獻[3]提出了一種扁彈簧分類和扭轉角度質量視覺檢測方法;文獻[4-7]設計了測量彈簧內外徑尺寸的視覺系統;文獻[8-9]提出了檢測彈簧座組件跨度、承載座尺寸和缺陷的視覺系統;文獻[10-11]開發了基于視覺的彈簧缺陷檢測系統。以上方法和系統以檢測彈簧內、外徑等參數及各類缺陷為主。
彈簧線徑指彈簧鋼絲的直徑,對彈簧的硬度、壽命、彈性耗能等性能有著決定性影響。關于彈簧線徑的檢測技術,文獻[12]公開了一種檢測彈簧線徑是否符合圖紙要求的裝置,使用時需把彈簧鋼絲插入裝置本體,通過能否插進各個通端孔來判斷彈簧線徑是否合格。該方法屬于機械接觸式測量,效率較低且無法測出彈簧線徑的具體數值。文獻[13]開發了一種檢測彈簧圓度、軸向直線度與表面質量的視覺系統,采用Hough變換[14]檢測彈簧線兩測的直線并由其距離得出彈簧各段的線徑。該方法檢測線徑有兩個問題:(1)彈簧邊沿為曲線,Hough直線檢測穩定性不足;(2)無法給出每個檢測點位的線徑及缺陷。針對一種特殊的汽車彈簧的逆向工程問題,文獻[15]開發了一種壓縮彈簧視覺測量系統,該系統可測量各個位置點的彈簧線徑,但測量效率較低,單個彈簧的測量時間長達150 min。
目前彈簧線徑的測量以采用游標卡尺等手工方式為主,存在工作效率和穩定性低且一般只對局部點位進行抽查檢測的問題。為克服現有技術在測量效率和檢測密度方面的不足,本文作者分析壓縮彈簧的成像特征和機器視覺測量彈簧線徑的難點,以彈簧中段部分近似直線的特征為出發點,以提取關鍵拐點為突破口,提出一種對壓縮彈簧中段線徑進行快速、高密度測量的方法。該方法單次測量可以在200 ms內完成數百個以上的彈簧中段線徑的測量。
圖1所示為典型的壓縮彈簧。壓縮彈簧為螺旋形狀,視覺成像后有如下特點:整體為不規則曲線;在兩端各約一圈的區域,彈簧線重疊度較高;在彈簧軸線兩側的區域,彈簧線不規則彎曲、部分重疊;在軸中心線附件的區域,彈簧線近似為直線;彈簧中線各段近似直線部分的長度差異較大。

圖1 壓縮彈簧
由于彈簧視覺成像的以上特點,文中問題的難點在于:(1)如何排除彈簧的非直線及重疊部分的干擾;(2)如何將各中段分開后進行分別測量,同時盡可能多地保留接近直線的部分以增加檢測點位的數目;(3)如何確定生成指定密度的檢測線段的數目、位置和方向。
圖2所示為方法的結構圖,由5個模塊構成:圖像采集模塊、圖像預處理模塊、關鍵拐點獲取模塊、中段邊沿直線擬合模塊和中段線徑測量模塊。

圖2 文中方法結構圖
圖像采集模塊用于獲取彈簧的外觀圖像,包括工業相機、鏡頭、光源和計算機,其中光源的選型和調節是關鍵。實驗中工業相機采用CMOS面陣相機,光源采用亮度可調的LED背光源,調光時在不損傷彈簧邊沿的條件下盡量增加背景亮度。圖3所示為采集到的彈簧圖像。
圖像預處理的目的在于提取彈簧的邊沿部分并去除背景中的噪點,包括如下4個步驟:
(1)對原圖進行二值化閾值分割。由于采用背光源且打光時已將背景打亮,因此采用簡單快速的固定閾值進行二值化;
(2)對二值圖像進行形態學膨脹處理。結構化元素的尺寸不能過大,一般使用3×3的矩形,否則可能會引起邊沿粘連而減少算法檢測的點位數;
(3)使用膨脹圖減去原圖獲得彈簧邊沿。針對此問題,對比Canny、Sobel邊沿提取算法,采用膨脹圖減去原二值圖的方法所獲取的彈簧邊沿更加完整、穩定;
(4)利用連通域分析[16]去除噪點。進行連通域分析后,保留面積最大的連通域。圖4所示為圖像預處理后的結果。

圖4 圖像預處理后的結果
獲取關鍵拐點的主要過程如圖5所示。關鍵拐點指彈簧邊沿內側的拐點,是彈簧各段之間的交界點,如圖5(d)中藍點所示。關鍵拐點的獲得是此算法的一個核心,是后續刪除彈簧非直線段部分以及將整個彈簧的各段分開并生成檢測基線等關鍵步驟的基礎條件。該模塊的實現較為復雜,包括如下9個步驟:
(1)獲取彈簧的最小外接矩形,記為RECT,其4個頂點存放到數組rect的4個元素中:rect[0]、rect[1]、rect[2]、rect[3],并調整4個頂點的順序,使得rect[0]、rect[1]為長邊(記為線段L1),rect[2]、rect[3]為長邊(記為線段L2),rect[0]和rect[3]為短邊(記為線段L3),圖5(d)標注了各邊和頂點;
(2)將彈簧邊沿在靠近外接矩形RECT短邊的兩側斷開,使得彈簧邊沿分成2個易于分別處理的子邊沿。記RECT的兩條長邊L1、L2的中線為L4,求L4與彈簧邊沿的靠近RECT的短邊兩側的交點,記為P1、P2;將2個交點P1、P2沿中線方向的小塊區域置零;
(3)獲取第1個子邊沿BW1,如圖5(a)所示。方法為對步驟(2)的結果圖進行連通域分析并保留最大連通域;
(4)獲取第2個子邊沿BW2并調整與BW1的位置關系。首先使用步驟(2)的結果圖減去步驟(3)的結果圖后保留最大連通域,然后以2個邊沿的重心到L1的距離為依據調整BW1和BW2的位置關系,使得BW1更靠近L1,BW2更靠近L2;
(5)斷開第1個子邊沿BW1,如圖5(b)所示。方法為先求L1和L4的中線L5,再將線段L1、L5包圍的矩形區域置零;
(6)獲取第1部分關鍵拐點集合1,如圖5(c)中實心圓點所示。方法為求圖5(b)中各連通區域中離L1最遠的點;靠近交點P1、P2的2個偽拐點被排除,排除方法為計算潛在關鍵點與步驟(2)中P1、P2的距離,如果過近,則認為不是關鍵拐點;
(7)斷開第2個子邊沿BW2。先求L2和L4的中線L6,再將L2、L6包圍的矩形區域置零;
(8)獲取第2部分關鍵拐點集合2。操作方法與步驟(6)類似,求步驟(7)中每個連通區中距離L2最遠的點;
(9)合并關鍵拐點集合并進行排序、清理,如圖5(d)中藍點所示。排序:距離短邊L3由近到遠排序,圖5(d)中用拐點處圓點的大小表示。清理:若兩端連續出現集合1或集合2的元素則只保留靠近另一個集合元素的那個,使得在合并、排序后的集合中交替出現集合1和集合2的元素。

圖5 獲取關鍵拐點的主要過程
中段邊沿直線擬合時,首先刪除彈簧非直線及彈簧線重疊的部分,再將各段邊沿分開,最后進行直線擬合。該模塊的實現步驟如下:
(1)斷開彈簧兩端線徑無法測量的部分。首先分別以關鍵拐點集合中第1個和最后1個點為圓心、以背景色為填充色繪制實心圓;求以上兩點到L1和L2的兩對垂足,以每對垂足為端點繪制背景色直線;
(2)刪除彈簧兩端部分,連通域分析后保留最大的2個連通域;
(3)刪除彈簧靠近邊界的非直線部分。首先,分別以L1、L2的2個端點和關鍵拐點集合中對應集合1和集合2中的關鍵點獲得2個閉包絡區域,然后調用閉包繪制函數(如OpenCV的drawContours函數)將2個閉包區域置零;
(4)進一步刪除彈簧靠近邊界的非直線部分。將線段L1、L5包圍的矩形區域內的所有像素點置零,將線段L2、L6包圍的矩形內的所有像素點置零;
(5)將分屬于彈簧不同段的邊沿分離,如圖6(a)所示。方法為以各關鍵拐點為圓心繪制背景色的實心圓;
(6)對各段邊沿進行排序。首先通過連通域分析獲得各段邊沿的重心,然后以各重心到短邊L3的距離從小到大排序。圖6(a)中不同大小的圓點為各段邊沿的重心,離L3距離越遠的點越大;
(7)對每個連通域分別進行最小二乘直線擬合,擬合結果如圖6(b)中各穿過邊界的直線所示。圖6為中段邊沿直線擬合的2個主要過程。

圖6 中段邊沿直線擬合的主要過程
該部分基于關鍵拐點集合和各段邊沿擬合直線生成檢測基線,再根據預設檢測密度生成檢測線段,最后完成線徑檢測與結果顯示,包括如下4個步驟:
(1)獲取檢測基線,即彈簧線兩側邊沿的中線,結果如圖6(b)中的各段彈簧中間的線段所示。首先進行直線配對,依次檢查相鄰的兩條擬合直線,若對應的2個邊沿的重心到L3的距離都落在關鍵拐點集合相鄰的2個關鍵點到L3的2個距離之間,則配對成功;然后求取以上2個關鍵拐點分別到配對成功的兩條擬合直線的兩對垂足,并分別求取每對垂足的中點,即為檢測基線的2個端點。
(2)完成各段彈簧線的線徑檢測,如圖7所示,與檢測基線垂直的細線段為檢測線段,其上的紅點為邊界點。以步驟(1)中的檢測基線為中線,以兩邊的2條擬合直線距離的1.8倍為檢測寬度生成檢測線段;以預設檢測密度為步長向檢測基線的另一端移動檢測線段,進行彈簧線徑檢測;檢測時以檢測線與前景相交且最長的一段為彈簧線徑,相交點為邊界點,2個邊界點的距離為該位置線徑。說明:①若檢測線未檢測到2個前景點(檢測基線的兩端),則認為該段不是彈簧線的近似直線部分而不進行測量;②若檢測到的2個前景點的中點不落在2條擬合直線之間(常見于2段彈簧的交界處),則將該對點判為誤檢測點排除。

圖7 檢測線段與邊界定位結果
(3)修正檢測結果,比較奇、偶數段測量數據的平均值,以平均值較小的為基準修正平均值較大的各段數據。原因:彈簧有一定的高度,各個被測彈簧中段離鏡頭的距離交替發生遠、近的變化,從而形成視差;由于測量時采用貼放在實驗臺底座上的直尺來標定像素當量(每像素對應的實際物理尺寸),使用離鏡頭較遠的各段數據修正離鏡頭較近的各段數據(測量值偏大)。
(4)檢測結果如圖8所示,在各檢測基線的首端附近標注各檢測段的編號,用于后續檢測數據列表各行與各檢測線段位置關系的確定。編號繪制方法:①求各檢測基線的首端和尾端的中點;②求各檢測基線的首端與長邊L1和L3的距離;③求中點到較小距離對應長邊(此例中奇數段對應L2,偶數段對應L1)的垂足;④以垂足為參數調用文字繪制函數(如OpenCV的putText函數)繪制相應的部位。

圖8 檢測結果圖像顯示部分
通過兩項實驗來評估文中方法的測量精度和在不同檢測密度下算法運行速度的變化情況。
由于手動檢測難以保證高密度精確移動,以較為稀疏的80像素為檢測密度對圖3所示的彈簧進行測量,再用電子游標卡尺(測量精度0.01 mm)對相應位置點進行手工測量。算法測量結果如圖9所示,共完成了22個位置點的線徑值測量。由表1可知:最大絕對誤差為0.04 mm,最大相對誤差為2.84%,達到了測量精度的基本要求。

圖9 測量精度實驗的檢測結果

表1 測量精度實驗數據
導致存在誤差的主要原因是光學成像問題,一方面打光無法完全保證成像后的邊沿與彈簧線的真實邊沿完全一致,另一方面對檢測結果的修正操作并不能完全消除成像“視差”的影響,后續擬采用遠心鏡頭替代該修正方案。另外相機存在一定的畸變等其他硬件因素導致測量結果存在誤差。
實驗便攜式計算機型號:華碩FX86F,CPU主頻:2.2 GHz,RAM:8 GB。首先以圖3中所示的彈簧為對象,隨機擺放并抓拍100張圖像;然后,以不同的檢測密度(即檢測線段之間的距離,該值越小檢測密度越高)進行批量測試。使用C++實現的該算法平均運行時間如表2所示。

表2 不同檢測密度下算法的運行時間
由表2可知:隨著檢測密度的增加,算法運行時間小幅度增加。檢測密度為5像素時最慢(平均檢測點位數為403個),算法平均運行時間為130.3 ms;檢測密度為80像素時最快(平均檢測點位數為21個),算法平均運行時間為120.4 ms。雖然二者檢測密度相差16倍(平均檢測點位數相差近20倍),但檢測速度變化僅為7.60%,說明由于增加檢測密度所增加的運算量并不大,檢測速度受測量密度調整的影響較小。
一方面,為說明此算法完整的使用方法,下面通過基于MFC和OpenCV實現的檢測系統并以圖3所示的對象的檢測結果為示例,介紹算法應用時的輸出格式樣式和各檢測位置線徑數據的查看方法。
另一方面,作為文中方法的一個應用場景,分別以2個不同型號的缺陷彈簧為例,演示該方法對壓縮彈簧局部點位的線徑過細和過粗2種異常情況的缺陷檢測能力。
圖10所示為檢測結果的軟件顯示界面,左側為結果圖片,右側為數據列表。

圖10 檢測結果的軟件顯示界面
左側結果圖片的顯示信息分為三部分:(1)左上角以文字的形式顯示檢測到的最小和最大線徑及閾值,若在范圍內則顯示OK,否則顯示NG;(2)右上角顯示該彈簧檢測是否通過結果,若所有檢測點的線徑值都在預設的閾值范圍內則顯示OK,表示通過,否則顯示NG,表示不通過;(3)中間彈簧部分,在彈簧各中段部分繪制檢測線段,若該檢測點的線徑值在預設的閾值范圍內,檢測線為綠色,否則為紅色。檢測線段上的藍點為定位到的彈簧邊界點,彈簧軸向兩側的數字表示已測量的各彈簧中段的編號。
右側列表部分包含三部分信息:(1)段號列的規律:第1個彈簧段的編號對應左側圖中彈簧軸向兩側的編號1,然后接著是第一段彈簧的多個檢測點編號,后續各段的數據格式與第1段一致;(2)最大值、最小值兩列為設定的高、低閾值;(3)測量值列為線徑檢測結果。左側圖中彈簧各段的編號與列表中彈簧段的編號一一對應,左側圖中靠近各段編號的檢測線為起始檢測線段位置,實現了每個檢測線位置的線徑與右側列表中的檢測值的一一對應。由左側圖可見算法進行了8段彈簧中段的線徑檢測,要查看右邊列表的完整數據需拖動列表右邊的滾動條。
由于檢測數據量較大,檢測結果的軟件顯示界面截圖的數據列表部分只能顯示部分檢測數據,表3所示為導出并整理后的完整數據。由于空間限制且圖10中已有顯示,表中沒有列出重復度較高的閾值信息。

表3 各檢測點的測量數據
分別以部分線徑過細和過粗的2個不同型號的缺陷彈簧為檢測對象,驗證算法對缺陷位置的檢測能力。
圖11(a)所示為缺陷樣例1原圖,左上角第2~3圈部分線徑偏細。圖11(b)所示為缺陷樣例2原圖,靠近中間的一小段部分線徑過粗。

圖11 缺陷樣例原圖
圖12(a)為缺陷樣例1的檢測結果。算法成功檢出線徑過細的部分,紅色線段標出了檢出低于閾值的線徑部分。圖12(b)為缺陷樣例2的檢測結果。算法成功檢出線徑過粗的部分,紅色線段標出了檢出高于閾值的線徑部分。

圖12 缺陷樣例檢測結果的軟件顯示界面
針對目前彈簧線徑測量方法效率低、測量密度小的問題,提出了一種基于機器視覺的壓縮彈簧中段線徑的測量方法。通過實驗驗證,該方法能夠在200 ms內完成數百個的檢測點位的線徑測量,測量密度和效率遠高于傳統的彈簧線徑測量方法,且具有較高的測量精度。通過轉動彈簧前后3次左右的測量,該方法可完成壓縮彈簧整個中間部分的線徑測量。但由于成像粘連,該方法無法測量壓縮彈簧兩端各1圈左右的部分以及拉伸彈簧的全部。