今天來複習研究所時期為了進行某科技廠的產學合作所嘗試過的方法:Harris Corner Detection。印象中那個時候是為了在測試機台上額外安裝攝影機拍攝 IC 托盤並進行影像辨識,判斷機械手臂是否有把 IC 托盤上所有的 IC 都夾走。但當然在機台上裝攝影機會讓機器失去原廠保固,後續產學就沒有繼續簽約了(笑
實作
原圖片,為了模擬實際機台拍攝的照片並不一定完整框住 IC 托盤,因此周圍都有留空。

接下來老樣子,讀圖片轉灰階
1 | rgb_img = cv2.imread(path) |

再來調整格式到 cv2.cornerHarris 的需求,並透過 cv2.cornerHarris 偵測 corner,以下參數直接套用官方教學文件之建議。
- img - 須為灰階圖片且為 float32
- blockSize - Corner 偵測的相鄰區域大小
- ksize - 索伯算子(Sobel operator)的參數
- k - 自由參數
1 | np_gray = np.float32(gray_img) |
為了方便在圖片上看到偵測的點,透過 cv2.dilate 擴大,並設 threshold 為 0.01 將其標在原始圖片上。
1 | dst = cv2.dilate(dst,None) |

不過不難發現,標出來的點有很多雜訊,因為桌子是有紋路的,而 HCD 的偵測方式之一就是兩條邊的周圍有明顯的光影變化。
當然在嚴謹的廠區中,這種狀況並不會發生,參數調整一下還是可以定位出 IC 托盤上每個孔的位置啦~~~
結語
當初花了時間研究了很多種方式去計算 IC 托盤上每個格子的位置,也嘗試過 data augmentaion 再丟 CNN 然後 SVM 做分類器。最後發現不是用越複雜的技術就一定可以達到成果,有時候簡單的方式也可以做到我們想要的效果。
因為攝影機的位置是固定的,廠內也不會關燈,後來我提出了以下方案也被老師們和科技廠窗口接受:
- 拍攝機械手臂運作前的 IC 托盤
- 拍攝機械手臂運作完畢的 IC 托盤
- 將兩者轉灰階後相減,若誤差過大則表示有誤差的位置有 IC 未被取出或放置錯誤。