在本文中,我们探讨了OpenCV 和Python 在创建强大的人脸识别系统方面的巨大潜力。从而逐步实现图像和视频中人脸识别的整个过程。通过清晰的解释和实际的例子,我们希望您对计算机视觉和人脸识别有更深入的了解。
访问官网下载安装:https://opencv.org/
(资料图片仅供参考)
pip install opencv-python安装完成后,我们可以在sources/data/haarcascades文件夹中看到这些文件
包含人眼识别、人脸识别等强大的识别算法
人脸抓拍功能模块。
首先导入cv库。
import cv2 然后调用我们的相机(0代表本地相机,其他数字代表外部相机)。
cap=cv2.VideoCapture(0) 使用while 循环来确定它是否打开。
while(cap.isOpened()): 获取每一帧的图像。
ret_flag,Vshow=cap.read() 调用控制键盘函数来控制和确定按键。
k=cv2.waitKey(1)0xFF 使用imshow 函数显示捕获的图像。
cv2.imshow('ceshi',Vshow) 监听键盘输入并按“s”键保存。
if k==ord('s'): 保存捕获图像的格式并打印提示文本。
cv2.imwrite('/tmp/'+str(num)+'.name'+'.jpg',Vshow) print('保存'+str(num)+'.jpg') print('---- ---------------------------------') num +=1 释放相机和内存。
cap.release()cv2.destroyAllWindows() 完整代码片段
导入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 导入依赖项
import osimport cv2from PIL import Imageimport numpy as np 存储人脸数据
facesSamples=[] 存储姓名数据
ids=[] 存储图像信息
imagePaths=[os.path.join(path,f) for f in os.listdir(path)] 加载分类器
face_cascade=cv2.CascadeClassifier('haarcascade_frontalface_default.xml') 遍历图像
for imagePaths: 将打开的图像转换为灰度
PIL_img=Image.open(imagePath).convert('L') 将图像转换为数组
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 并返回数据
print('id',id) print('fs:',facesSamples) return facesSamples,ids 调用图像路径(第1步抓取人脸后,按s键将图像保存在路径'/tmp/'下)
path='/tmp/' 检索图像数组和ID 标签数组和名称
faces,ids=getImageAndLabels(path) 加载识别器
recognizer=cv2.face.LBPHFaceRecognizer_create() 训练数据
recognizer.train(faces,np.array(ids)) 创建一个目录来存储读取的人脸信息
recognizer.write('tmp/tupian.yml') 完整代码片段
导入osimport cv2from PIL 导入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')
导入依赖项
import cv2import os 加载训练好的数据文件
recognizer=cv2.face.LBPHFaceRecognizer_create() 加载保存的人脸信息
recogizer.read('tmp/tupian.yml') 定义名称数组
name=[] 定义全局变量用于标识
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) 导入存储的图像名称标签
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): 中断释放内存和视频
cv2.destroyAllWindows()cap.release() 完整代码片段
导入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('结果',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: 标志,frame=cap.read() if not flag:breakface_detect_demo(frame)iford('')==cv2.waitKey(10):breakcv2.destroyAllWindows()cap.release()最后,希望这些示例代码对您的项目有所帮助!