在本文中,我們探討了OpenCV 和Python 在創(chuàng)建強大的人臉識別系統(tǒng)方面的巨大潛力。從而逐步實現(xiàn)圖像和視頻中人臉識別的整個過程。通過清晰的解釋和實際的例子,我們希望您對計算機視覺和人臉識別有更深入的了解。
訪問官網(wǎng)下載安裝:https://opencv.org/
(資料圖片僅供參考)
pip install opencv-python安裝完成后,我們可以在sources/data/haarcascades文件夾中看到這些文件
包含人眼識別、人臉識別等強大的識別算法
人臉抓拍功能模塊。
首先導(dǎo)入cv庫。
import cv2 然后調(diào)用我們的相機(0代表本地相機,其他數(shù)字代表外部相機)。
cap=cv2.VideoCapture(0) 使用while 循環(huán)來確定它是否打開。
while(cap.isOpened()): 獲取每一幀的圖像。
ret_flag,Vshow=cap.read() 調(diào)用控制鍵盤函數(shù)來控制和確定按鍵。
k=cv2.waitKey(1)0xFF 使用imshow 函數(shù)顯示捕獲的圖像。
cv2.imshow('ceshi',Vshow) 監(jiān)聽鍵盤輸入并按“s”鍵保存。
if k==ord('s'): 保存捕獲圖像的格式并打印提示文本。
cv2.imwrite('/tmp/'+str(num)+'.name'+'.jpg',Vshow) print('保存'+str(num)+'.jpg') print('---- ---------------------------------') num +=1 釋放相機和內(nèi)存。
cap.release()cv2.destroyAllWindows() 完整代碼片段
導(dǎo)入cv2cap=cv2.VideoCapture(0) falg=1num=1 while(cap.isOpened()): ret_flag,Vshow=cap.read() k=cv2.waitKey(1)0xFF cv2.imshow('ceshi',Vshow ) if k==ord('s'): cv2.imwrite('/tmp/'+str(num)+'.name'+'.jpg',Vshow) print('保存'+str(num)+ '.jpg') print('-------------------------') num +=1 elif k==ord(' '): 中斷cap.release()cv2.destroyAllWindows()
在編寫此功能模塊之前,我們需要在該文件的根目錄下使用以下命令在Pycharm或cmd中安裝face模塊
pip install opencv-contrib-python 導(dǎo)入依賴項
import osimport cv2from PIL import Imageimport numpy as np 存儲人臉數(shù)據(jù)
facesSamples=[] 存儲姓名數(shù)據(jù)
ids=[] 存儲圖像信息
imagePaths=[os.path.join(path,f) for f in os.listdir(path)] 加載分類器
face_cascade=cv2.CascadeClassifier('haarcascade_frontalface_default.xml') 遍歷圖像
for imagePaths: 將打開的圖像轉(zhuǎn)換為灰度
PIL_img=Image.open(imagePath).convert('L') 將圖像轉(zhuǎn)換為數(shù)組
img_numpy=np.array(PIL_img,'uint8') 獲取圖片中的面部特征
faces=Face_Detector.detectMultiScale(img_numpy) 獲取每張捕獲圖片的id和名稱
id=int(os.path.split(imagePath)[1].split('.')[0]) 防止拍攝沒有臉部的照片
for x,y,w,h in faces: ids.append(id) facesSamples.append(img_numpy[y:y+h,x:x+w]) 打印面部特征和ID 并返回數(shù)據(jù)
print('id',id) print('fs:',facesSamples) return facesSamples,ids 調(diào)用圖像路徑(第1步抓取人臉后,按s鍵將圖像保存在路徑'/tmp/'下)
path='/tmp/' 檢索圖像數(shù)組和ID 標(biāo)簽數(shù)組和名稱
faces,ids=getImageAndLabels(path) 加載識別器
recognizer=cv2.face.LBPHFaceRecognizer_create() 訓(xùn)練數(shù)據(jù)
recognizer.train(faces,np.array(ids)) 創(chuàng)建一個目錄來存儲讀取的人臉信息
recognizer.write('tmp/tupian.yml') 完整代碼片段
導(dǎo)入osimport cv2from PIL 導(dǎo)入Imageimport numpy as np def getImageAndLabels(path): facesSamples=[] ids=[] imagePaths=[os.path.join(path,f) for f in os.listdir(path)] Face_Detector=cv2. CascadeClassifier('open-cv-installed-path/sources/data/haarcascades/haarcascade_frontalface_default.xml') for imagePath in imagePaths: PIL_img=Image.open(imagePath).convert('L') img_numpy=np.array(PIL_img,' uint8') faces=face_detector.detectMultiScale(img_numpy) id=int(os.path.split(imagePath)[1].split('.')[0]) for x,y,w,h faces: ids.append (id) facesSamples.append(img_numpy[y:y+h,x:x+w]) print('id',id) print('fs:',facesSamples) return facesSamples,ids if __name__=='__main__': path='/tmp/' faces,ids=getImageAndLabels(path) recognizer=cv2.face.LBPHFaceRecognizer_create() recognizer.train(faces,np.array(ids)) recognizer.write('tmp/tupian.yml')
導(dǎo)入依賴項
import cv2import os 加載訓(xùn)練好的數(shù)據(jù)文件
recognizer=cv2.face.LBPHFaceRecognizer_create() 加載保存的人臉信息
recogizer.read('tmp/tupian.yml') 定義名稱數(shù)組
name=[] 定義全局變量用于標(biāo)識
warningtime=0 視頻模塊中的人臉識別
defface_detect_demo(img):gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)face_Detector=cv2.CascadeClassifier('open-cv-installed-path/sources/data/haarcascades/haarcascade_frontalface_default.xml')face=face_ detector.detectMultiScale(灰色)對于face:中的x,y,w,h cv2.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2) cv2.circle( img,center=(x+w//2,y+h//2),radius=w//2,color=(0,255,0),thickness=1) ids,confidence=recogizer.predict(gray[y:y] + h, x:x + w]) ifconfidence 80: global warningtime warningtime +=1 if warningtime 100: # warning() warningtime=0 cv2.putText(img, 'unknown', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX , 0.75, (0, 255, 0), 1) else: cv2.putText(img,str(names[ids-1]), (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255 , 0), 1) cv2.imshow('result',img) 導(dǎo)入存儲的圖像名稱標(biāo)簽
def name(): 路徑='/tmp/' # 名稱=[] imagePaths=[os.path.join(path,f) for f in os.listdir(path)] for imagePath in imagePaths: name=str(os. path.split(imagePath)[1].split('.',2)[1]) names.append(name)加載視頻
cap=cv2.VideoCapture('1.mp4')name()while True: flag,frame=cap.read() 如果不是flag: 中斷face_detect_demo(frame) if ord(' ')==cv2.waitKey(10): 中斷釋放內(nèi)存和視頻
cv2.destroyAllWindows()cap.release() 完整代碼片段
導(dǎo)入cv2import osrecogizer=cv2.face.LBPHFaceRecognizer_create()recogizer.read('tupian/tupian.yml')names=[]warningtime=0defface_detect_demo(img):gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)face_ detector=cv2 .CascadeClassifier('open-cv-installed-path/sources/data/haarcascades/haarcascade_frontalface_default.xml')face=face_detector.detectMultiScale(gray) for x,y,w,h in face: cv2.rectangle(img,(x, y),(x+w,y+h),顏色=(0,0,255),厚度=2) cv2.circle(img,center=(x+w//2,y+h//2),半徑=w//2,color=(0,255,0),thickness=1) ids,confidence=recogizer.predict(gray[y:y + h, x:x + w]) ifconfidence 80: global warningtime warningtime +=1 if warningtime 100: # warning() warningtime=0 cv2.putText(img, 'unkonw', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1) else: cv2.putText(img,str (名稱[ids-1]), (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1) cv2.imshow('結(jié)果',img) def name():路徑='/tmp/' # 名稱=[] imagePaths=[os.path.join(path,f) for f in os.listdir(path)] for imagePath in imagePaths: name=str(os.path.split(imagePath) )[1].split('.',2)[1]) name.append(name)cap=cv2.VideoCapture('1.mp4')name()while True: 標(biāo)志,frame=cap.read() if not flag:breakface_detect_demo(frame)iford('')==cv2.waitKey(10):breakcv2.destroyAllWindows()cap.release()最后,希望這些示例代碼對您的項目有所幫助!