請撰寫一個程式,利用數學型態學影像處理運算(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
左為侵蝕膨脹後的圖像,右為邊緣偵測的圖像
沒有留言:
張貼留言