請撰寫一個程式,利用數學型態學影像處理運算(erode(), dilate()等函式),計算出所附圖像(共三張)每張圖像中圍棋個數。
a. 請在部落格呈現經由數學型態學影像處理運算後的圖像,同時要呈現你程式輸出棋 子數量的螢幕截圖。
b. 程式不一定可以算出正確棋子數量,越接近正確答案越好!
二、 使用環境:
1. Visual Studio 2019
2. OpenCV 4.2.0
3. 程式語言: C++
三、 實作方法:
主要的流程是:
- 圖片做模糊處理
 - 消除黑棋上的反光
 - 對圖片做二值化
 - 偵測邊緣
 - 算出棋子的輪廓
 - 篩選
 - 取得黑棋的數量
 
使用到的函式有:
- imread()-讀取圖片
 - imwrite()-儲存圖片
 - GaussianBlur()-高斯模糊
 - getStructuringElement()-可以得到特定形狀及大小的結構元素,用來處理侵蝕或膨脹
 - morphologyEx()- Opening,先將圖片做侵蝕再膨脹,把反光消除掉
 - threshold()-圖像二值化
 - Sobel()-用於邊緣偵測
 - convertScaleAbs()-將16點陣圖片轉化成為8點陣圖形進行顯示
 - addWeighted()-影像疊加,用於水平和垂直邊緣偵測後的圖像處理
 - findContours()-可尋找物件(棋子)的輪廓及計算黑棋數量
 - contourArea()-計算物件的面積,用於替除掉因反光而計算到輪廓的物件(反光區域的面積較小)
 
三張圖黑棋的實際數量依序為:24, 31, 31
偵測後的結果依序為:22, 31,31
偵測後的結果依序為:22, 31,31
左為侵蝕膨脹後的圖像,右為邊緣偵測的圖像




沒有留言:
張貼留言