人臉識别系統(一)
- 前言
- 一,開發環境和包介紹
- 二,調用攝像頭
- 三,導入OpenCV自帶人臉識别器識别人臉
- 四,儲存到本地
-
- 1,自動建立路徑
- 2,加上儲存的代碼
- 下部分預告
前言
為了激勵自己完整的寫程式,也為了儲存代碼,也為了分享知識。。。總之,我決定在CSDN上寫寫自己作為一個菜雞的寫程式過程,以避免工作後問寫過啥東西之後無話可說。
正好學期末學校找企業的老師來帶我們做課設,這次使用python開發人臉識别系統,雖然課設很水,就是較了怎末調用人臉識别接口,但是我還是想把這個東西擴充一下做出個有點用的東西出來。
在此記錄一下吧,給位看官有問題歡迎留言指導或詢問。大佬們看見問題懇請指導一下,誰都是從菜鳥過來的,多多感謝。
一,開發環境和包介紹
系統 | Windows10 |
python版本 | python3.7 |
IDE環境 | pycharm2019 |
依賴包 | numpy() |
核心依賴包 | opencv-python,opencv-contrib-python |
注1 | 這倆包有啥具體的差別我也不知道。。知道的小夥伴麻煩指導下吧。 |
使用anaconda虛拟環境的可能在anaconda裡找不到的,直接pip安裝即可。
注意事項 |
---|
opencv安裝包有很多但是不要都裝!全安裝上反而會沖突 |
有調用opencv包出錯的情況可以試試重安裝下試試 |
二,調用攝像頭
不BB,上代碼運作試試。
import cv2 #調用opencv
cap = cv2.VideoCapture(0) #打開攝像頭,0為自帶攝像頭,外設用1,2...試試
while(True):
ret, frame = cap.read()#獲得圖像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)#轉化為灰階
cv2.imshow('Frame', frame)#顯示
k = cv2.waitKey(30) #設定視訊重新整理頻率,機關為毫秒,傳回值為鍵盤按鍵的值
if k == 27:#如果摁下esc則退出
break
cap.release()#關閉攝像頭
cv2.destroyAllWindows()#銷毀全部窗體
運作結果:
三,導入OpenCV自帶人臉識别器識别人臉
這裡主要是調用人臉識别分類器 haarcascade_frontalface_default.xml
找不到的打開我的電腦搜尋檔案。
一般就放在自己的包環境裡
實在沒的:百度網盤提取碼:wf7r
放在.py同級目錄下
import cv2
cap = cv2.VideoCapture(0)#打開攝像頭
# 人臉識别分類器
faceCascade = cv2.CascadeClassifier(r'E:\ANACONDA\envs\FaceRecognition\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')
while(True):
ret, frame = cap.read()#獲得圖像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)#轉化為灰階
faces = faceCascade.detectMultiScale( # 人臉檢測
gray,#灰階圖,使用灰階圖會提高效率
scaleFactor=1.05,#圖檔縮小的值
minNeighbors=10,#判斷次數
minSize=(16, 16)#人臉最小尺寸
)
for (x, y, w, h) in faces:#faces中時一個圖檔中所有識别出來的人臉,有可能時多個
#畫臉的方框
cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 255, 0), 2)#圖像源,原點,終點,線的顔色,粗細
cv2.imshow('Frame', frame) #顯示
k = cv2.waitKey(30) #設定視訊重新整理頻率,機關為毫秒,傳回值為鍵盤按鍵的值
if k == 27:
break
cap.release()#關閉攝像頭
cv2.destroyAllWindows()#銷毀全部窗體
運作結果:
四,儲存到本地
1,自動建立路徑
儲存到本地要現有個儲存路徑,總是自己打開檔案夾建立好煩的,先實作自動建立路徑
#建立目錄代碼
def mkdir(path):
import os # 引入子產品
path = path.strip()# 去除首位空格
path = path.rstrip("\\") # 去除尾部 \ 符号
isExists = os.path.exists(path) # 判斷路徑是否存在.存在 True ,不存在 False
# 判斷結果
if not isExists:# 如果不存在則建立目錄
os.makedirs(path) # 建立目錄操作函數
print(path + ' 路徑建立成功')
return True
else: # 如果目錄存在則不建立,并提示目錄已存在
print(path + ' 目錄已存在')
fileNum=len([lists for lists in os.listdir(path)])#獲得該路徑下檔案數量
return fileNum #傳回路徑下檔案數量
2,加上儲存的代碼
import cv2
import tools
cap = cv2.VideoCapture(0)#打開攝像頭
# cap.set(3, 640)
# cap.set(4, 480)
# 人臉識别分類器
faceCascade = cv2.CascadeClassifier(r'E:\ANACONDA\envs\FaceRecognition\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')
face_id=int(input("你的編号"))
path="./MyFaces/"+str(face_id)# 儲存路徑
count=tools.mkdir(path)# 目前已有圖像個數
ObjectNum=count+1000# 目标儲存個數
while(True):
ret, frame = cap.read()#獲得圖像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)#轉化為灰階圖
faces = faceCascade.detectMultiScale( # 人臉檢測
gray,#灰階圖,使用灰階圖會提高效率
scaleFactor=1.05,#圖檔縮小的值
minNeighbors=10,#判斷次數
minSize=(16, 16)#人臉最小尺寸
)
for (x, y, w, h) in faces:#faces中時一個圖檔中所有識别出來的人臉,有可能時多個
#畫臉的方框
cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 255, 0), 2)#圖像源,原點,終點,線的顔色,粗細
count+=1#個數加一
fac_gray = gray[y: (y + h), x: (x + w)]#擷取臉部圖檔
cv2.imwrite(path+'/' + str(face_id) + '.' + str(count) + '.jpg', fac_gray) # 儲存圖像
break #隻取一個,取完就退。
cv2.imshow('Frame', frame)#顯示
k = cv2.waitKey(30) #設定視訊重新整理頻率,機關為毫秒,傳回值為鍵盤按鍵的值
if k == 27:#如果摁下esc鍵則退出
break
elif count>=ObjectNum:#收集的數量足夠則退出
break
cap.release()#關閉攝像頭
cv2.destroyAllWindows()#銷毀全部窗體
運作結果:
這裡我存了一千張,建議一次存一百張就行,效果差距不大,一千張太慢了。
下部分預告
至此,就完成了簡單的人臉識别和錄入功能,但是還無法識别出來誰是誰,下次完成人臉識别系統的訓練和識别子產品。
更新後将添加下部分連結:先睡覺。