使用前需要pip三个库,如下:
pip install opencv2-python
pip install opencv-contrib-python
pip install Image
本人python刚学没多久如果有任何错误欢迎指出
1.捕获摄像头并且截图,用于训练
# 捕获人脸图片
import cv2 as cv
if __name__ == "__main__":
# 监视摄像头,0是自带的摄像头,如果有其它设备可以将0改为其他数字试试
video = cv.VideoCapture(0)
# 方便给照片命名
num = 0
# 按下s捕获,按下q退出
while True:
status, frame = video.read()
# 显示每一帧
cv.imshow('myself video listen', frame)
if not status:
break
# 按下s捕获,图片保存在face_image文件夹下
if ord('s') == cv.waitKey(0):
cv.imwrite('保存图片的文件夹路径'+str(num)+'.name.png', frame)
num += 1
# 按q退出
if ord('q') == cv.waitKey(0):
break
# 释放空间
video.release()
cv.destroyAllWindows()
2.训练数据
# 数据训练
import cv2 as cv
import numpy as np
import os
from PIL import Image
# 训练每一张照片
def train(path):
# 路径列表,包含了路径中的所有图片的名字
paths = [os.path.join(path, file) for file in os.listdir(path)]
# 人脸数据据列表
faces = []
# id列表
ids = []
# 导入分类器
face_detect = cv.CascadeClassifier(r'分类器目录')
# 遍历每一张图片
for image_path in paths:
# 以灰度模式打开图片
gray_image = Image.open(image_path).convert('L')
# 将图片转化为数组,以黑白深浅
face_character = np.array(gray_image, 'uint8')
# 人脸识别,方便获取人脸范围的x,y,w,h,方便将人脸数据范围追加到faces列表中
face = face_detect.detectMultiScale(face_character)
# 获取照片的id,将string改为int
id = int(os.path.split(image_path)[1].split('.')[0])
# 将得到的人脸数据写入到相应列表中,这样写是为了防止未识别面容的出现
for x, y, w, h, in face:
# ids追加id
ids.append(id)
# faces只需要追加扫描到的人脸的范围即可,这里面追加的是变成数组的照片信息
faces.append(face_character[y:y+h, x:x+w])
# 返回列表
return faces, ids
if __name__ == "__main__":
path = '自己想要训练的人脸数据的照片的文件夹路径,图片的命名格式是1.name.png'
# 将得到的人脸数据和id数据保存
faces, ids = train(path)
# 加载识别器
recognizer = cv.face.LBPHFaceRecognizer.create()
# 训练
recognizer.train(faces, np.array(ids))
# 保存
recognizer.write('数据保存路径,数据的后缀名是yml')
3.人脸识别
import cv2 as cv
# 加载识别器
recognizer = cv.face.LBPHFaceRecognizer.create()
# 加载数据
recognizer.read('人脸数据的保存路径')
# 图像处理
def face_detect_demo(img):
# 转换为灰度图像
gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 加载分类器
face_detect = cv.CascadeClassifier(r'分类器路径')
# 人脸识别
face = face_detect.detectMultiScale(
gray_img, 1.1, 5, 0, (100, 100), (900, 900))
for x, y, w, h in face:
# 对识别的人脸评分
ids, confidence = recognizer.predict(gray_img[y:y+h, x:x+w])
# 小于60说明可信
if confidence < 60:
# 在原图上用绿色方框框住,并且注明identified
cv.rectangle(img, (x, y, w, h), color=(0, 255, 0), thickness=2)
cv.putText(img, 'identified', (x+10, y-10), 3, 0.5, (0, 255, 0), 1)
else:
# 在原图上用红色方框框住,并且注明unkown
cv.rectangle(img, (x, y, w, h), color=(0, 0, 255), thickness=2)
cv.putText(img, 'unkown', (x+10, y-10), 3, 0.5, (0, 0, 255), 1)
# 显示图片
cv.imshow('img', img)
if __name__ == "__main__":
# 监视摄像头
video = cv.VideoCapture(0)
while True:
status, frame = video.read()
if not status:
break
face_detect_demo(frame)
if ord('q') == cv.waitKey(0):
break
# 释放内存
video.release
cv.destroyAllWindows()
有任何错误欢迎大家指出