OpenCV人脸识别实例
文章目录
- 1.图片基本处理
- 2.图片和视频人脸检测
- 3.训练数据和人脸识别
2020年5月29日学习了b站 人脸识别的简单教程,笔记记录于此
1.图片基本处理
import cv2 as cv
# 读取图片,路径中不能有中文
img = cv.imread('img.jpg')
# 显示图片
cv.imshow('BGR_img', img)
# 修改图片尺寸
resize_img = cv.resize(img, dsize=(210, 210))
print('原来图片的尺寸', img.shape, '\n修改后的图片尺寸', resize_img.shape)
""" 原来图片的尺寸 (689, 690, 3) 修改后的图片尺寸 (210, 210, 3) """
# 将图片灰度转换
gray_img = cv.cvtColor(resize_img, cv.COLOR_BGR2GRAY)
cv.imshow('gray_img', gray_img)
# 保存图片
cv.imwrite('gray_img.jpg', gray_img)
# 只有输入q的时候退出q
# while True:
# if ord('q') == cv.waitKey(0):
# break
# 等待键盘的输入,单位为毫秒,传入0无限等待
cv.waitKey(3000)
# opencv底层是C++语言,使用完内存必须释放内存
cv.destroyAllWindows()
2.图片和视频人脸检测
import cv2 as cv
def face_detect_demo(img):
# 将图片转换为灰度
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 加载特征数据
face_detector = cv.CascadeClassifier('E:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt_tree.xml')
# faces = face_detector.detectMultiScale(gray,scaleFactor=1.01,minNeighbors=2,maxSize=(42,42),minSize=(28,28))
faces = face_detector.detectMultiScale(gray)
for x, y, w, h in faces:
# 绘制矩形边框
cv.rectangle(img, (x, y), (x+w, y+h), color=(0, 255, 0), thickness=2)
# 绘制圆形边框
cv.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=(0, 255, 0), thickness=2)
cv.imshow('result', img)
# 加载图片
img = cv.imread('face.jpg')
face_detect_demo(img)
cv.waitKey(0)
cv.destroyAllWindows()
# 读取视频
cap = cv.VideoCapture('video.mp4')
while True:
flag, frame = cap.read()
print('flag:', flag, 'frame.shape:', frame.shape)
if not flag:
break
face_detect_demo(frame)
if ord('q') == cv.waitKey(10):
break
cv.destroyAllWindows()
cap.release()
多张人脸时检测效果不好
3.训练数据和人脸识别
import os
import cv2 as cv
import PIL.Image
import numpy as np
def getImageAndLabels(path):
facesSamples = []
ids = []
imagePaths = [os.path.join(path, f) for f in os.listdir(path)]
print(imagePaths)
# 检测人脸
face_detector = cv.CascadeClassifier('E:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt_tree.xml')
# 遍历列表中所有图片
for imagePath in imagePaths:
# 打开图片
PIL_img = PIL.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:
# 人脸区域切片
facesSamples.append(img_numpy[y:y+h, x:x+h])
ids.append(id)
return facesSamples, ids
if __name__ == '__main__':
# 1.训练数据
path = './data/jm/' # 图片路径
# 获取图像数组和id标签数组
faces, ids = getImageAndLabels(path)
# 获取训练对象,加载训练集数据集文件
recognizer = cv.face.LBPHFaceRecognizer_create()
recognizer.train(faces, np.array(ids))
# 保存文件
recognizer.write('trainer/trainer.yml')
# 2.人脸识别
# 读取已经训练好的文件
recognizer.read('trainer/trainer.yml')
# 准备识别的图片
img = cv.imread('11.pgm')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
face_detector = cv.CascadeClassifier('E:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt_tree.xml')
faces = face_detector.detectMultiScale(gray)
for x, y, w, h in faces:
cv.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 人脸识别
id, confidence = recognizer.predict(gray[y:y + h, x:x + w])
print('标签id:', id, '置信评分:', confidence)
cv.imshow('result', img)
cv.waitKey(0)
cv.destroyAllWindows()
输出结果:
['./data/jm/1.pgm', './data/jm/10.pgm', './data/jm/11.pgm', './data/jm/12.pgm', './data/jm/13.pgm', './data/jm/14.pgm', './data/jm/15.pgm', './data/jm/2.pgm', './data/jm/3.pgm', './data/jm/4.pgm', './data/jm/5.pgm', './data/jm/6.pgm', './data/jm/7.pgm', './data/jm/8.pgm', './data/jm/9.pgm']
标签id: 11 置信评分: 0.0
还没有评论,来说两句吧...