---
# System prepended metadata

title: Computer System Lab

---

Computer System Lab
===

### Lab 1 FTIR

#### Problem 1 - Handwritten Digit Recognition

1. utils.py
```
find_tap(frame , threshold_grayscale = 127 , threshold_area = 100)
```
+ 參數 : 
    + frame : 型別為numpy array，代表攝影機畫面。
    + threshold_grayscale : 型別為int，若像素的值小於threshold_grayscale，就將其值改為0，反之則改為255。
    + threshold_area : 型別為int，若發光區域的面積大於等於threshold_area，就判定其為有手指接觸，反之則判定為沒有手指接觸。
+ 回傳值 : 
    + (numer_of_tap , center) : 型別為tuple，其中number_of_tap的型別為int，代表有多少個手指接觸的區域，center的型別為list，長度為number_of_tap，並且其中的每一個元素之型別為tuple，代表每一個手指接觸區域的中心座標。
+ 實作 : 
    + 先將攝影機畫面轉為灰階圖片，再使用threshold_grayscale將其轉為二元圖片，接著使用skimage.measure.label函式找出圖片中的連通區域，接著計算每一個連通區域的面積，若其面積大於等於threshold_area，代表其為一個手指接觸區域，此時再計算該區域中所有像素座標的平均值，作為該區域的中心座標。

2. digit_recognition.py
```
test(image , parameter = 'CNN.h5')
```
+ 參數 : 
    + image : 型別為numpy array，代表要進行辨識的圖片，必須為灰階圖片，並且其中的像素值必須為0或1。
    + parameter : 型別為str，代表CNN的參數路徑。
+ 回傳值 : 
    + predict : 型別為int，代表CNN預測的結果。

3. VideoCapture.py
+ 實作 : 
    + 宣告一個大小與攝影機畫面相同且元素皆初始為0的numpy array，稱之為track。首先會先使用前述的find_tap函式找出圖片中手指接觸區域的中心位置，若有手指接觸，便將track中手指接觸區域的中心位置的值記為1，並記錄此時的時間做為最後一次有手指接觸的時間點，而若沒有手指接觸，則計算現在的時間與最後一次有手指接觸的時間之間的差，若時間差超過2秒(代表數字已經寫完，或是根本就沒有寫任何數字)並且track內有不為0的元素(代表有寫入數字)，便使用前述的test函式進行辨識並輸出預測的結果，最後將track內的所有元素皆改為0。