###### tags: `影像處理`
# *2022/06/06 影像處理 期末報告*
## mian.py:
```
import module_Unlock as MU #導入解鎖模組
import winsound #導入Windows內建音效撥放模組
filename_1 = './WelcomeVoice.wav' #設定解鎖成功音效
filename_2 = './ErrorVoice.wav' #設定解鎖失敗音效
UnlockCheck = MU.Unlocker() #呼叫模組方程式進行解鎖,解鎖成功會回傳1
if UnlockCheck==1: #解鎖成功
print("\n-------------------------------------------")
print("Unclock Successful! Enjoy!")
winsound.PlaySound(filename_1, winsound.SND_FILENAME) #播放解鎖成功音效
else:
print("\n-------------------------------------------")
print("You are not match person")
winsound.PlaySound(filename_2, winsound.SND_FILENAME) #播放解鎖失敗音效
print("\n-------------------------------------------")
print("Thank You!")
print("Invite you to participate in feedback activity sincerely!")
```
## module_Unlock.py:
```
import module_Record as MR #導入建模模組
import cv2
import numpy as np
import time
#解鎖引導程式
def Unlocker():
print("Welcome to use Unlocker")
print("Protect Your file by FaceID")
print("Support Mask wearing\n")
print("-------------------------------------------")
print("Please enter your Name:", end='')
Name = input()#取得使用者名字(建議使用英文)
CheckNumber_Without = 1#設定沒有口罩的驗證flag為1,方便不用每次都要重新建模
CheckNumber_With = 1#同理
PassNumber = 0#解鎖成功flag,預設為0
num_of_secs = 5#關閉視窗秒數
while True:
print("-------------------------------------------")
print("Options:")
print("1.Record Face without Mask")
print("2.Record Face with Mask")
print("3.Unlock Progress")
print("4.Quick")
Selection = int(input("Select one options: "))#取得使用者選擇
if Selection == 1:
CheckNumber_Without = Build_Module_Without_Mask()#呼叫建模函式
elif Selection == 2:
CheckNumber_With = Build_Module_With_Mask()#呼叫模組建模
elif Selection == 3:
print("\n-------------------------------------------")
print("Preparing......")
if CheckNumber_With == 0 or CheckNumber_Without == 0:#確認是否已建模
print("You can't Unlock because you haven't create a module")
break
else:#已經建模了
# Training產生YML檔
detector = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml') # import the OpenCV Model of face
recog = cv2.face.LBPHFaceRecognizer_create() # Open Training method
faces = [] # Store face
ids = [] # Store id
for i in range(1, 13):
img = cv2.imread(f'./Model_No_Mask/Model_No_Mask{i}.jpg') #依序開啟每一張照片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #色彩轉換成黑白
img_np = np.array(gray, 'uint8')
face = detector.detectMultiScale(gray) #擷取人臉區域
for (x, y, w, h) in face:
faces.append(img_np[y:y + h, x:x + w]) #記錄人臉的位置和大小內像素的數值
ids.append(1) #記錄人臉對應的 id,只能是整數,都是 1 表示人臉的 id 為 1
for i in range(1, 13):
img = cv2.imread(f'./Model_Wearing_Mask/Model_Wearing_Mask{i}.jpg') #依序開啟每一張照片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #色彩轉換成黑白
img_np = np.array(gray, 'uint8')
face = detector.detectMultiScale(gray) #擷取人臉區域
for (x, y, w, h) in face:
faces.append(img_np[y:y + h, x:x + w]) #記錄人臉的位置和大小內像素的數值
ids.append(2)#記錄人臉對應的 id,只能是整數,都是 2表示人臉的 id 為 2
recog.train(faces, np.array(ids)) # 開始訓練
recog.save('face.yml')#生成YML檔案
# Recognize the face
recognizer = cv2.face.LBPHFaceRecognizer_create() #啟用訓練人臉模型方法
recognizer.read('./face.yml') # 讀取人臉模型YML檔
cascade_path = "./haarcascade_frontalface_default.xml" #載入人臉追蹤模型
face_cascade = cv2.CascadeClassifier(cascade_path) #啟用人臉追蹤
cap = cv2.VideoCapture(0) #開啟攝影機
if not cap.isOpened():
print("Camera Open Failure")#攝影機開啟失敗
exit()
while True:
ret, img = cap.read()
if not ret:
print("Cannot receive frame")
break
img = cv2.resize(img, (640, 480)) #預設尺寸為680*480
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #轉換成黑白
faces = face_cascade.detectMultiScale(gray) #追蹤人臉 (目的在於標記出外框 )
# 建立姓名和 id 的對照表
name = {
'1': Name,
'2': Name + str("_Mask")
}
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) #標記人臉外框
idnum, confidence = recognizer.predict(gray[y:y + h, x:x + w]) #取出 id 號碼以及信心指數 confidence
if confidence < 50:
text = name[str(idnum)] # 如果信心指數小於 50,取得對應的名字
print("Check Finished")
PassNumber = 1#將解鎖成功flag設為1
print("The Windows Will close in 5 seconds")
while num_of_secs:
print(num_of_secs, end=' ')
time.sleep(1)
num_of_secs -= 1
print("\n")
break
else:
text = 'Unrecognize' # 不然就是Unrecognize
# 在人臉外框旁加上名字
cv2.putText(img, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv2.LINE_AA)
if PassNumber == 1:
return PassNumber#回傳解鎖成功的訊號回主程式
break
cv2.imshow('Recognize Window', img)
if cv2.waitKey(5) == ord('q'):#按下 q 鍵停止解鎖
print("Unlock Unseccessful")
PassNumber=0#將解鎖成功flag設為0,表示失敗
return PassNumber#回傳解鎖失敗的訊號回主程式
break
cap.release()
cv2.destroyAllWindows()#關閉所有視窗
elif Selection == 4:
break
return PassNumber#將解鎖成功flag預設的0回傳,表示失敗(沒有經過解鎖認證)
def Build_Module_Without_Mask():
print("-------------------------------------------")
print("Please Press 'S' to Shot")#按下S表示拍照建模
print("We Will Shot for 12 times")#取得12個角度的人臉模型
print("Press 'Q' to Quick Building")#按下Q表示放棄建模
print("Preparing.......")
CheckNumber_Without = MR.FaceRecordWithoutMask() # Call Module to Record a Face and set a flag to check whether successful
# Check the Model whether build successfully
while True:
if (CheckNumber_Without == 1):#建模成功
break
else:#建模失敗
print("Build Fail")
print("Please try again")
print("Preparing......")
CheckNumber_Without = MR.FaceRecordWithoutMask()#重新再建模
return CheckNumber_Without#CheckNumber_Without=1表示建模成功,否則失敗
def Build_Module_With_Mask():
print("-------------------------------------------")
print("Please Press 'S' to Shot")
print("We Will Shot for 12 times")
print("Press 'Q' to Quick Building")
print("Preparing.......")
CheckNumber_With = MR.FaceRecordWithMask() # Call Module to Record a Face and set a flag to check whether successful
while True:
if (CheckNumber_With == 1):
break
else:
print("Build Fail")
print("Please try again")
print("Preparing......")
CheckNumber_With = MR.FaceRecordWithoutMask()
return CheckNumber_With#CheckNumber_With=1表示建模成功,否則失敗
```
## module_Record.py
```
import cv2
#Block_01
#Record the Face Without Mask
def FaceRecordWithoutMask():
cap = cv2.VideoCapture(0) # 建立一個 VideoCapture 物件
num = 1 # 遞增,用來儲存檔名
CheckNumber = 1
while (cap.isOpened()): # 迴圈讀取每一幀
ret_flag, Vshow = cap.read() # 返回兩個引數,第一個是bool是否正常開啟,第二個是照片陣列
cv2.imshow("Model_No_Mask", Vshow) # 視窗顯示,顯示名為 Model_No_Mask
k = cv2.waitKey(1) & 0xFF # 每幀資料延時 1ms,延時不能為 0,否則讀取的結果會是靜態幀
if k == ord('s') : # 若檢測到按鍵 ‘s’,列印字串
cv2.imwrite("./Model_No_Mask/" +"Model_No_Mask"+ str(num) + ".jpg", Vshow)
print("Success to save " +"Model_No_Mask"+ str(num) + ".jpg")
print("-------------------------")
num = num+1
CheckNumber = 1
elif k == ord('q'): # 若檢測到按鍵 ‘q’,退出
CheckNumber = 0
break
elif num==13:
print("Model Build Successfully")
break
cap.release() # 釋放攝像頭
cv2.destroyAllWindows() # 刪除建立的全部視窗
return CheckNumber
#Block_02
#Record the Face With Mask
def FaceRecordWithMask():
cap = cv2.VideoCapture(0) # 建立一個 VideoCapture 物件
num = 1 # 遞增,用來儲存檔名
CheckNumber = 1
while (cap.isOpened()): # 迴圈讀取每一幀
ret_flag, Vshow = cap.read() # 返回兩個引數,第一個是bool是否正常開啟,第二個是照片陣列,如果只設定一個則變成一個tumple包含bool和圖片
cv2.imshow("Model_Wearing_Mask", Vshow) # 視窗顯示,顯示名為 Capture_Test
k = cv2.waitKey(1) & 0xFF # 每幀資料延時 1ms,延時不能為 0,否則讀取的結果會是靜態幀
if k == ord('s') : # 若檢測到按鍵 ‘s’,列印字串
cv2.imwrite("./Model_Wearing_Mask/" +"Model_Wearing_Mask"+ str(num) + ".jpg", Vshow)
print("Success to save " +"Model_Wearing_Mask"+ str(num) + ".jpg")
print("-------------------------")
num = num+1
CheckNumber = 1
elif k == ord('q'): # 若檢測到按鍵 ‘q’,退出
CheckNumber = 0
break
elif num==13:
print("Model Build Successfully")
break
cap.release() # 釋放攝像頭
cv2.destroyAllWindows() # 刪除建立的全部視窗
return CheckNumber
```
## module_AutoBox.py
```
from selenium import webdriver
import click as click
driver = webdriver.Chrome('./chromedriver')
driver.get('https://sso.tku.edu.tw/NEAI/logineb.jsp?myurl=https://sso.tku.edu.tw/aissinfo/emis/tmw0012.aspx') # 開啟淡江大學成績查看頁面登入視窗
def login():
# Login information
# StudentID
# 利用HTML語法中的id抓取學號輸入格
account = driver.find_element_by_xpath("//*[@id=\"username\"]")
account.clear()
account.send_keys("學號")
# StudentPassword
# 利用HTML語法中的id抓取密碼輸入格
password = driver.find_element_by_xpath("//*[@id=\"password\"]")
password.clear()
password.send_keys("密碼")
# Login
# 利用HTML語法中的id抓取登入鍵並按下
driver.find_element_by_xpath("//*[@id=\"loginbtn\"]").click()
# ShowGrade
# 利用HTML語法中的id抓取成績選項
driver.find_element_by_xpath("//*[@href=\"TMWS030.aspx\"]").click()
return 0
```