切換
舊版
前往
大廳
主題

[專題]OpenCV影像辨識

Adam | 2018-06-08 00:22:05 | 巴幣 0 | 人氣 3333

前言:
  原先本來是預計製作有關車用Bootloader的專題,不過資源太少,指導老師對這塊也還不熟悉只是想嘗試,最後只好更換專題,接觸了影像辨識這個大領域,專題完成後也了解自己得作品問題點在哪裡,之後若要增加辨識率應該要往哪個方向走才對,這東西不難但是要做出很成功的作品有很深的學問。
--------------------------------------------------------------------------------------------------------------------------
  我們的專題是設計在監控工廠設備上的燈號與數字等等,因此用了七段顯示器與LED來模擬,也製作了一個壓克力模型來放置,主要是想減少工廠中調去監控工廠的人力資源,將這個責任交給沒有疲勞問題的機器來處理。
  
  那七段顯示器跟LED最簡單的辨識方法就是顏色,而我們所熟悉的RGB三原色對於亮度和顏色之間的相關性太高,並不適合拿來做辨識的工具,舉例來說,你想偵測紅色便以R值得大小來判斷,但是都光線變化之後,周遭變成比較亮,也就是變白了,而白色=R+G+B,所以白色的R也會很大,系統會將白色也判斷成紅色,會造成後續處理上得麻煩,所以我們將RGB轉為HSV的格式。
圖片來自GOOGLE找圖
  HSV是一種將顏色分為角度、飽和度、亮度的圓錐體,因為主要是用角度去區分的關係,所以理想上辨識並不會受到光線影響,但實際上在操作時,我們的專題還是很受光線影響,這個問題我後續在解釋為什麼。
  
  不過我們在進行偵測顏色之前,我們先使用了背景相減法濾除掉周遭不需要的背景,看圖很容易了解。

簡單說兩者相減後只會保留有變化的部分,不過在實際應用上,環境可能會隨著天氣、光線等等變亮,導致相減之後留下很多雜物,不過我們專題很吃光線的主要原因並不是這個。
  
  相減之後進行偵測顏色,留下了數字輪廓,如下圖,而其中會發現這輪廓只是像個數字但用來判斷還不太行,而我當時多想為何會不像個完整數字,而這就是為何我們專題轉成HSV依然很吃光線的原因。
  
  原因就是,我們的人眼在看LED燈時,紅的就是紅的,綠的就是綠的,但是在鏡頭截圖時,LED中間較亮的地方,其實會是白的,也就是說,我們很吃光線的問題並不是因為程式寫錯,而是硬體上的不足,若是鏡頭拍照對顏色的敏感度跟人眼一樣,今天我們就不會遇到很吃光線這個問題了,可惜這問題直到專題做完後才發現。

以七段顯示器為例,抓取紅色部分的範圍,抓取出了數字輪廓。

  如同上方所說的,因為用輪廓還判斷數字還有些勉強,因此我們用上了Dilate和Close這兩種方法來整形輪廓,簡單來說Dilate是使用者設計一個遮罩使得物體放大,而Close則是讓物體之間的空洞給填補起來。

經由Dilate放大過後。
再由Close給填補起來,比起一開始的輪廓,經過兩種方法整形之後現在更像個完整的數字了。

  OK,再來是很重要的一步,必須讓系統知道這整個數字為一個物件,否則這個數字隊系統來說只是個一堆點組合而成的圖案而已,為什麼要讓系統知道這是個物件呢?原因在於物件可以計算出長、寬、面積、座標等等較為複雜的屬性,而我們在區分所要的部分與雜訊就是利用面積與長寬大小來判斷的,我們使用了連通標記演算法,簡單說就是讓系統一行一行讀取,讓彼此相近的點給予同一個標籤,而同一個標籤的的點最後就統合為一個物件。

示意圖。

  那我們知道數字的座標之後,就可以輕易的將數字給擷取下來儲存到資料夾中,供下次辨識時的參考資料,我們是利用擷取下來的數字照和資料夾中的所有照片進行點對點的相減,找出答案最小的照片是哪張,就能夠得知這次辨識出來的照片是哪個數字了。

  那LED的部分方法幾乎是一樣的,只是我們最後是讓系統知道由左到右的LED分別是哪一種顏色(只有紅綠),紅色代表工廠有狀況發生,綠色代表安全,用手機APP改變燈號來模擬工廠是否有問題產生。

  最後用JAVA寫個很簡單的圖形介面來展示圖片和結果,因為時間不夠所以JAVA端是利用讀取標籤來辨識要產生那些文字,不過還是比起C產生的終端機來的好看多了。


  那為了增加互動感,我們在數字部分,可以由JAVA端設定溫度門檻,若是辨識到的數字大於或等於設定的溫度門檻就會發出溫度過高的警示音,而LED部分則是每個燈泡都有對應的工廠狀況例如:水位不足、引擎故障等等,若該燈泡表示的工廠狀況為紅燈,就會不斷發生警示音提醒使用者。
  發出聲音的方法則使用window.h裡頭的PlaySound函式來達成。



心得:
  這個專題是定位在,許多傳統工廠的設計是不具有網路功能的,因此架設這個系統再透過遠端就能從遠處觀看工廠現在的狀況,不過最後我們只得到了佳作,若是能夠解決環境光線影響的話就會更完美了,這個專題預計之後會增加指針式的辨識以及高空監測人體動作,但也有可能會留給下一屆的專題生來製作了,無論如何,我也學會了基礎的影像辨識邏輯,影像辨識這部分很有趣,先前也製作過車牌辨識的程式,不過辨識率只有5%,卻是班上算高的了哈哈,下一篇文章預計介紹自己透過OpenGL製作的射擊遊戲,大概是暑假中的事了吧。

創作回應

更多創作