李國洪 喬 澤
(天津理工大學電氣工程與自動化學院,天津 300382)
隨著工業自動化程度的不斷提高,在焊接過程中盡量以機器代替人的工作可以大大地提高焊接生產效率,而且產品精度與合格率也可以得到一定的保障。文獻[1]提到在實現整個焊接自動化的過程中,主要分為焊縫識別、焊縫圖像提取、焊縫圖像處理以及焊縫跟蹤幾個部分,其中焊縫識別與焊縫圖像提取作為焊接自動化要解決的第一個步驟,同時也是實現自動化焊接最關鍵的技術之一。傳統的焊縫測量方式主要有超聲波測距、激光測距和雷達測距等等,但這些測量方式往往存在設備成本高、操作程序復雜等缺點,更不適于被移植到低功耗、低成本的嵌入式設備中。而隨著近年來圖像處理技術與計算機視覺技術的蓬勃發展,視覺測距技術在各行各業取得了優異的成績和表現,比如常見的單目視覺測距系統在硬件上僅僅需要增加1個圖像傳感器就能代替完成以往復雜系統才能完成的測量工作。如在文獻[2]提出了基于圖像處理的車輛焊縫間隙檢測系統,可實現對車輛焊縫間隙的精準檢測。
本文考慮到在一些環境較為惡劣,不適于人參與的焊接環境中,可以利用嵌入式微控制器進行圖像采集與處理,實現焊縫寬度的非接觸式測量,從而進一步控制焊接過程中電機的啟停或執行下一步的焊接動作。另外,因為STM32微控制器以其低成本,低功耗與高性能等優點[3-5],近年來被用在了人工智能、物聯網、自動駕駛和工業自動化等各個行業,同時因為其較快的時鐘頻率,可實現較為復雜的圖像處理算法,所以也多被應用于嵌入式圖像處理設備中。故本文利用STM32設計了一種焊縫寬度測量系統,具有低功耗、低成本以及可輕松移植安裝到其他焊接設備中等優點。
采用意法半導體公司的STM32F407ZGT6芯片作為系統的主MCU。外部連接OV2640攝像頭負責采集焊縫圖像,擴展SRAM負責存儲圖像數據,LCD液晶顯示負責圖像的輸出,按鍵可控制顯示屏輸出原始RGB彩色圖或圖像處理后的二值圖。串口模塊負責圖像幀率,焊縫中像素點及計算以后焊縫實際寬度等數據的輸出。系統整體框圖如圖1所示。

圖 1 系統整體框圖
MCU是整個系統運行的核心,MCU一方面要與數字攝像頭OV2640、液晶屏和串口等外圍模塊進行通信,完成對其內部寄存器的讀寫與配置,使其能夠正常工作。另一方面還要運行之后的圖像處理子程序對攝像頭采集到的原始圖片進行處理。所以在選擇MCU時,在考慮較低的價格和滿足低功耗要求之外,還要確保其運行速度要足夠快。本設計采用的STM32F407ZGT6是基于ARMCortex-M4內核的32位高性能處理器[6],該芯片包括USART、SPI、IIC、CAN和DCMI等豐富的通信接口。并且幾乎每種通信接口都有獨立的硬件資源與之對應,可以通過庫函數輕松配置實現MCU與各種從器件之間的通信,十分簡單方便。另外作為一種多用途的單片機,STM32F407ZGT6主頻可以達到168 MHz,足可以運行圖像處理程序與簡單的圖形界面,很好地實現人機交互。
OV2640 是一款CMOS 類型的數字圖像傳感器,由豪威科技(OmniVision)公司生產。該傳感器具有體積小、工作電壓低的特點,最大可輸出200萬像素的圖像。并且還支持輸出 RGB565 和JPEG 等格式的圖像數據,可以通過伽瑪曲線、白平衡、飽和度和色度等方式來修改捕獲的圖像,進行一些簡單的補償處理,所以該攝像頭多被應用于低功耗嵌入式設備中同步時鐘信號等,主要通過與STM32的DCMI外設連接,通過VGA時序獲取圖像數據流。
為了能實時觀察焊接過程中兩焊接件的位置情況,進一步提高系統的可靠性,所以選擇將攝像頭采集到的圖像通過LCD液晶顯示屏實時展現出來。液晶顯示采用1塊2.8寸大小且分辨率為320×240的TFT液晶屏,因為STM32F407ZGT6內部沒有內置LCD控制器,所以該液晶屏自帶了驅動芯片,最終通過STM32的FSMC接口模擬出8 080時序進行驅動。
STM32F407ZGT6內部有192 K字節的SRAM,但是對于系統要存儲圖像并且運行一系列的圖像處理程序是遠遠不夠的,所以使用FSMC接口擴展了1個16位寬512 K容量(即1 M字節)的CMOS靜態內存芯片 IS62WV51216。使用 FSMC 的 BANK1區域 3 來控制 IS62WV51216,根據 Cortex-M4 內核的存儲空間分布以及FSMC的地址映射關系,可知IS62WV51216的內存首地址被分配在了0x68000000處。在之后的軟件設計時,可以利用C語言中指針的方式將圖片存儲在外部SRAM中。外部擴展SRAM電路如圖3所示

圖 3 外部 SRAM 電路
系統采用STM32作為主要的控制芯片,keil5作為程序的編譯環境,編程語言采用C語言,使程序具有較高的可移植性與運行效率。系統初始化主要包括OV2640的初始化程序設計,擴展外部SRAM的程序設計,按鍵與LCD顯示屏的驅動設計。另外在之后的圖像處理程序中定義了大量的局部變量,所以需要程序設計之前在STM32 官方提供的標準固件庫中找到啟動文件startup_stm32f40_41xxx.s,并在啟動文件中將整個程序的棧空間放大到至少20 K,否則會導致程序運行不正常或程序跑飛。系統軟件設計的整體流程如圖4。

圖 4 系統軟件設計流程圖
STM32F4系列的單片機為驅動數字攝像頭設計的外設接口即 DCMI(digital camera interface),是1個同步并行接口。設計輸出圖像格式為RGB565,圖像分辨率為320×240,而且數據寬度為8位。所以1個像素點數據所占的內存空間大小為2個字節,儲存這樣1幀完整的圖像需要的內存空間大小為320×240×2=153 600(字節),而 STM32F407ZGT6內部只有192 K字節的SRAM,加之程序中還要定義一些全局變量,所以將圖像直接存儲在內部SRAM是不現實的。但若直接將圖片的緩沖數組定義在擴展的外部SRAM中,經測試,由于主控芯片對外部SRAM的訪問速度遠小于DCMI采用DMA傳輸方式時的讀寫速度,所以會導致圖像數據的丟失與LCD液晶顯示畫面的失真。所以最終采用DMA(直接存儲區訪問)的雙緩沖機制,在內部SRAM中定義2個大小適中的接收數組,交替接收DCMI接收到的圖像數據,之后再依次存儲到外部SRAM中。
若將1幀分辨率為XSIZE*YSIZE圖片的左上角作為坐標原點,設其圖像數據為image_in,那么距離圖像原點在水平方向上為i,垂直方向上為j(即(i,j)處)位置的像素值,可以用數組image_in[j][i]或指針*(image_in+j*XSIZE+i)來表示[7]。考慮到數據指針具有動態分配內存的優點,所以使用第二種方式來表示圖像,充分利用內存空間。將彩色圖進行灰度化處理采用移位算法[8-9],具體公式為

式中:Gray為灰度值;“R”“G”“B”分別為RGB565圖像數據中紅、綠、藍顏色的分量。
圖像二值化的過程即選取合適的閾值,將灰度圖的像素值僅劃分為0或255,所以過程中最重要的就是閾值的選取[10]。在數字圖像處理時針對閾值選取的常見方法有雙峰法,Otsu法(大津法),迭代法等,例如文獻[11]中提出利用改進的大津算法對地鐵隧道裂縫圖像進行二值化。文獻[12]則在焊縫圖像分割中通過重復使用迭代法來獲得較為理想的圖像分割效果。本文考慮到迭代法原理簡單,代碼容易實現,且在焊縫圖像中可以取得良好的分割效果,所以最終采取迭代法獲取圖像二值化的最佳閾值,使用迭代法自動選取圖像二值化閾值的流程如圖5。

圖 5 迭代法自動選取閾值流程圖
由于大多數情況下,焊接現場的環境都十分惡劣與復雜,充滿了大量的噪聲污染,給圖像的采集與后續的處理造成了很大的困難與干擾。不但影響焊縫的目標提取,而且會干擾焊縫間像素點的統計結果從而使最終的焊縫寬度測量不準確。所以在圖像處理過程中加入圖像降噪以及濾波算法一方面可以使圖像分割更加細節化;另一方面可以提高系統的精度與可靠性,減少或消除噪聲形成的系統誤差。文獻[13]提出了幾種常見的濾波方法對圖像進行去噪處理,如高斯濾波、均值濾波、中值濾波和形態學濾波器濾波等。文獻[14]提出了一種自適應尺寸的中值濾波算法。經測試,與傳統中值濾波算法相比較,采用該算法不僅能夠很好地去除圖像噪聲,而且能使焊接件與焊縫邊界更加清晰順滑。
假設實際焊接場景為:焊接過程中鋼板1位置固定不動,由鋼板2緩慢靠近鋼板1。則為了方便實時統計兩鋼板間的像素點個數,需要對鋼板1進行區域標記。利用文獻[15]中提到的區域生長算法對鋼板1進行區域標記的具體步驟為:
(1)手動選取鋼板1中任意1個或多個像素點作為種子點。
(2)設計生長準則為:像素值等于255。
(3)將種子點作為初始生長點,同時標記種子點屬于目標區域Q。
(4)搜索所有生長點八鄰域內的像素點,去除其中已經屬于區域Q的像素點,同時去除其中超過圖片邊界的像素點。
(5)將剩余的像素點與其對應的生長點進行對比,判斷是否滿足生長準則,將其中滿足生長準則的像素點與種子點合并,歸屬于區域Q,同時將其標記為新的生長點。
(6)判斷新的生長點個數是否為零,若不為零則返回步驟4;若為零則結束算法,同時輸出最終合并區域Q,即目標區域。并將目標區域像素值改為27(可取其他數值)。
圖像經二值化和區域標記后各區域像素的灰度值如圖6和圖7。

圖 6 二值化后各區域像素的灰度值

圖 7 區域標記后各區域像素的灰度值
可見經圖像濾波和區域標記后,兩鋼板、焊縫和背景區域的像素值被很好地分割開來。所以焊縫間的像素點個數可以通過不同區域邊界上像素值發生跳變這一特點被方便地統計出來,最后再根據固定焦距下測得的單個像素點的實際尺寸K便可以求得實際的焊縫寬度,參見文獻[16]中對混凝土表面裂縫寬度的計算。
本文具體做法為:在程序中定義2個初始值為0的變量U、V。在遍歷1幀圖像所有像素點的過程中,選定任意的一行,若圖像的數據指針*(image_in+j*XSIZE+i)發生圖7所示跳變,即記錄當時的橫坐標分別作為焊縫的左右邊緣點并對應賦值給U和V。當V的值不等于0時,焊縫間的像素點個數W=V-U。多次統計不同位置焊縫間像素點個數W1,W2,··,Wn,然后進行排序找到焊縫間的最大寬度Wmax[17]。然后再根據固定焦距下測得的單個像素點的實際尺寸K,從而計算出兩塊鋼板之間的實際最大焊縫寬度L=KWmax。
當V的值等于0時,鋼板1與鋼板2都被區域標記算法標記為“27”,此時兩鋼板之間無縫隙,此時可在程序中發出后續的焊接指令。
將兩塊鋼板放置在攝像頭的視野內,固定其中一塊的位置不動,緩慢移動另一塊使二者靠近。實時觀察LCD顯示屏中二值化圖像的動態效果如圖8。統計串口模塊發出的焊縫間像素點及其對應的焊縫最大寬度如表1。

表1 系統測試結果
本文以STM32F407ZGT6單片機和OV2640圖像傳感器為核心,對其內存與其圖像的采集和存儲機制進行了充分的考慮與測試。在此基礎上實現了焊縫圖像采集與寬度測量系統的設計,具有成本低、功耗低及集成度高等優點。能夠減少焊接過程中的人為參與,能夠滿足較高精度要求的焊接應用場景。

圖 8 LCD 顯示