python人臉識別、語音合成、智慧簽到系統(2)
基於python+face_recognition+opencv+pyqt5+百度AI實現的人臉識別、語音播報、語音合成、模擬簽到系統(2)
人臉識別效果圖
-
功能介紹
檔案
ft2.py (對漢字實現轉碼opencv的puttxt不支援漢字需要轉碼)
baiduyuyin.py這個是語音合成模組使用的是百度ai的語音合成其中的API-KEY等資訊需要去百度註冊獲得
voice_syn_ui.py是語音合成的一個介面,只是一個小框
face_re_ui.py 是主介面 裡面包括一些按鈕和lable 進度條等主介面資訊
openui.py 是主程式 幾乎所有這個專案能實現的功能都在這裡
photo資料夾用來放需要照片(需注意照片清晰度太低會識別不出人臉會報錯)
video_screenshot是用來放拍照的照片
Amg.jpg是頭像face3.jpg是背景
mysh.ttf是一個字型檔案ft2.py 需要用到
text.txt是用來放個人的詳細資訊*(需要注意這裡個人資訊的格式按照原格式放,不然會讀不出來)
data.xls是用來記錄被攝像頭識別出的人(有時間 事件可以按需求修改)
1主介面
使用pyqt5構建,9個按鈕 一個進度條 還有隱藏的7個lable顯示資訊 裡面多次使用佈局 為更加美觀多次很多的矩形都使用黃金比例構建
實現新增背景 新增頭像 改變按鈕顏色等功能
詳細程式碼看face_re_ui.py
2開啟攝像頭
由於這個專案是基於實驗室需要所做,所以在開啟攝像頭按鈕處有三個,我所使用的攝像頭是海康威視的,與我電腦在同一區域網使用的是rtsp地址進行訪問,對於攝像頭也需要一些配置,為處理更快需要降低幀率解析度 等。如果是在筆記本上使用把self.source改成0, 同時下面使用到source的人臉識別 語音播報 錄入資訊到excel模組也需要把對source的判斷刪掉 到主介面把按鈕改一下就好 (修改中如有問題可以聯絡)開啟攝像頭會有兩到三秒的延遲(不同電腦可能會不同)
使用video_source(self,num) 該函式用於連線按鈕並根據按鈕提供source即攝像頭的rtsp地址 裡面進行判斷之後
傳入下一個函式btn_open_cam_click(self,num) 這個函式用來判斷攝像頭的狀態,這個函式裡面還有一些對攝像頭是否開啟的判斷來修改按鈕,如果沒被開啟就執行下一個函式show_camera(self) 這個是開啟攝像頭顯示畫面的函式,裡面也包含了進行人臉識別的函式
其中由於這個是在ui上的lable顯示攝像頭畫面,opencv 讀取圖片的樣式,不能通過Qlabel進行顯示,需要轉換為Qimage QImage(uchar * data, int width,在程式碼140行左右。
3拍照
拍照時開啟攝像頭以及進行人臉識別時都可以進行的,會彈出一個確定的提示框,由於學python不是太好多執行緒還沒學好,這裡並不是多執行緒,點選拍照的時候視訊會停。(有時間去好好學學多執行緒再進行修改)照片會以時間命名,放到video_screenshot資料夾中。
程式碼在 photo_face(self) 函式中,前提是攝像頭開啟的狀況下。把當前的一幀影象獲取出來並以時間命名(獲取時間轉換成字串)
4人臉識別
語音播報和記錄人臉資訊都是基於人臉識別進行的,首先有個進度條progressbarr_move(self);timerEvent(self, e)兩個函式,其次使用的是python的一個庫face_recognition 進行識別,使用opencv開啟,人臉識別模組中,首先載入影象,影象在一個photo資料夾中,獲取face_encoding臉部資訊,如果影象沒有人臉資訊此時會報錯,然後會進入處理視訊畫面的while迴圈 對每幀影象進行處理,當找到人臉的時候開始進行匹配,會把每幀影象找到的人記錄下來,放到一個集合中去,呼叫這個函式show_picture(self)在人臉識別的右邊顯示 識別出來人的詳細資訊姓名年齡等,這些資訊是提前錄入的,再使用write_record(self):函式,進行對每次獲取的人處理記錄到一個excel中去,然後再進行對人臉進行標框顯示漢字226行左右,這部分是核心功能,程式碼量比較大,涉及到的東西用到的知識也是比較多,也有部分原因是我python學的不是很精,一些程式碼處理的不夠短小。
進度條是一個假的進度條並不是能夠顯示真正的進度,而是對時間的處理對值的一些限定判斷從而實現類似進度條的效果。
獲取資料夾中人臉資訊部分,使用對字串的處理能夠實現,自己提取出名字放入集合,使用迴圈遍歷資料夾中的照片人臉資訊。
show_picture(self)函式中從text.txt檔案中提取出來每個人的資訊,進行和從影象中找到的人臉進行匹配,匹配成功的會在右側lable顯示那個人的照片和詳細資訊,顯示資訊和顯示圖片的lable是獨立的但是在呼叫的時候是一塊呼叫顯示,結束之後有一個qingping()函式進行清屏,但是此處有個bug,當存在多個人臉時顯示詳細資訊關閉人臉識別會存在一張或兩張照片還沒能解決。
write_record(self):函式能夠把攝像頭看到的人臉都記錄到表格中去,從而能夠達到模擬簽到,由於每幀獲取到的人臉可能會不同,所以需要對集合 元祖的處理達到記錄的人臉不重複不遺漏。然後還有對excel的操作,開啟讀寫的操作使用xlutils.copy庫,具體對excel的寫入看程式碼。
人臉標框漢字顯示,人臉標框是使用opencv 實現,漢字顯示名字是使用了ft2這個轉碼的檔案實現,因為opencv的puttxt不支援漢字輸入,然後再進行opencv呈現到lable 的一些轉換.
5語音合成 語音播報
語音合成程式碼在baiduyuyin.py 使用的是百度ai的語音合成模組。這個需要到百度AI上面註冊建立一個活動,獲取APP-ID等資訊用於驗證,這個地方電腦需要聯網,用於驗證資訊的正確性。
Openui.py中語音合成是第二個ui介面,一個輸入框兩個按鈕,輸入資訊到輸入框點選合成,會獲取到輸入的資訊並呼叫語音合成模組生成音訊開啟音訊,點選關閉,會關閉頁面同時結束播放音訊的軟體。(播放音訊我這裡使用的是系統開啟音訊,推薦軟體potplayer)
語音播報是一個單獨的按鈕,會把出現過攝像頭的人的姓名都以語音合成的形式播放出來,使用到的集合跟錄入到excel中的集合類似。
6錄入資訊
這裡點選錄入資訊按鈕,會開啟檔案開啟框,直接開啟的是照片的資料夾,返回上一級找到text.txt是放詳細資訊的文字。該項目錄入資訊只要放入該人的照片到photo資料夾中以人名命名圖片字尾為jpg,詳細資訊放到text.txt文字,並按原格式放入(當時學的python還沒學到檔案處理那塊,所以用的是一種很麻煩的方法放資訊)
7檢視記錄
在人臉識別模組中記錄下來的識別出的人的資訊放集合中,write_record(self)函式中有詳細的程式碼,對集合的處理保證獲取到的資訊不會重複,不會遺漏。裡面有對excel的操作實現寫入資料,實際使用的不是直接在原檔案上面寫而是把原檔案的資訊複製下來新建一個檔名一樣的檔案複製到裡面,再向這個新檔案裡面寫入資料。
目前存在的漏洞:記錄資訊那塊不是很完善,邏輯錯誤會盡快改掉;顯示詳細資訊那塊lable上的照片刪不掉目前還沒找到解決辦法,應該嘗試換種清理lable的方法;程式碼裡面如果操作失誤沒有相關的提示資訊(因為這個很多地方都需要完善需要去考慮)
寫這個程式碼的時候python學的還不是很好,使用到的一些語句以及方法都不是很好,需要去完善,還會更新,下一步可能會使用face++的人臉識別模組,face_recognition不是很穩定
如有問題,或有什麼建議可加群:894243022或發郵箱[email protected]
使用本文章或程式碼還請宣告。