opencv实现简单人脸识别

作者:Lin_QC 时间:2021-08-26 07:49:06 

对于opencv 它提供了许多已经练习好的模型可供使用,我们需要通过他们来进行人脸识别

参考了网上许多资料 

假设你已经配好了开发环境 ,在我之前的博客中由开发环境的配置。

项目代码结构:

opencv实现简单人脸识别

dataSet : 存储训练用的图片,他由data_gen生成,当然也可以修改代码由其他方式生成

haarcascade_frontalface_alt.xml  、 haarcascade_frontalface_default.xml: 用于人脸检测的haar分类器,网上普遍说第一个效果更好,第二个运行速度更快

data_gen.py:生成我们所需的数据

trainer.py: 训练数据集

train.yml: 由train.py生成的人脸识别模型,供后面的人脸识别使用

recognize.py:视频中的人脸识别

data_gen.py

连续拍20张照片当作训练数据,每个人建立一组数据


import cv2

detector = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
cap = cv2.VideoCapture(0)
sampleNum = 0
Id = input('enter your id: ')

while True:
ret, img = cap.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = detector.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)

# incrementing sample number
sampleNum = sampleNum + 1
# saving the captured face in the dataset folder
cv2.imwrite("dataSet/User." + str(Id) + '.' + str(sampleNum) + ".jpg", gray[y:y + h, x:x + w]) #

cv2.imshow('frame', img)
# wait for 100 miliseconds
if cv2.waitKey(100) & 0xFF == ord('q'):
break
# break if the sample number is morethan 20
elif sampleNum > 20:
break

cap.release()
cv2.destroyAllWindows()

train.py

训练数据


import cv2
import os
import numpy as np
from PIL import Image

# recognizer = cv2.createLBPHFaceRecognizer()
detector = cv2.CascadeClassifier("/Users/qiuchenglin/PycharmProjects/face_recognize/haarcascade_frontalface_alt.xml")
recognizer = cv2.face.LBPHFaceRecognizer_create()

def get_images_and_labels(path):
image_paths = [os.path.join(path, f) for f in os.listdir(path)]
face_samples = []
ids = []

for image_path in image_paths:
image = Image.open(image_path).convert('L')
image_np = np.array(image, 'uint8')
if os.path.split(image_path)[-1].split(".")[-1] != 'jpg':
continue
image_id = int(os.path.split(image_path)[-1].split(".")[1])
faces = detector.detectMultiScale(image_np)
for (x, y, w, h) in faces:
face_samples.append(image_np[y:y + h, x:x + w])
ids.append(image_id)

return face_samples, ids

Faces, Ids = get_images_and_labels('dataSet')
recognizer.train(Faces, np.array(Ids))
recognizer.save('trainner.yml')

recognize.py

下面就是根据训练好的模型进行人脸识别,根据之前生成数据的编号,可以填入相对应的人名,例如以下示例我训练了三组人的数据


import cv2
import numpy as np

recognizer = cv2.face.LBPHFaceRecognizer_create()
# recognizer = cv2.createLBPHFaceRecognizer() # in OpenCV 2
recognizer.read('/Users/qiuchenglin/PycharmProjects/face_recognize/trainner.yml')
# recognizer.load('trainner/trainner.yml') # in OpenCV 2

cascade_path = "/Users/qiuchenglin/PycharmProjects/face_recognize/haarcascade_frontalface_alt.xml"
face_cascade = cv2.CascadeClassifier(cascade_path)
cam = cv2.VideoCapture(0)
# font = cv2.cv.InitFont(cv2.cv.CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 1, 1) # in OpenCV 2
font = cv2.FONT_HERSHEY_SIMPLEX

while True:
ret, im = cam.read()
gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.2, 5)
for (x, y, w, h) in faces:
cv2.rectangle(im, (x - 50, y - 50), (x + w + 50, y + h + 50), (225, 0, 0), 2)
img_id, conf = recognizer.predict(gray[y:y + h, x:x + w])
if conf > 50:
if img_id == 1:
img_id = 'liuzb'
elif img_id == 2:
img_id = 'linqc'
elif img_id == 3:
img_id = 'keaibao'
else:
img_id = "Unknown"
# cv2.cv.PutText(cv2.cv.fromarray(im), str(Id), (x, y + h), font, 255)
cv2.putText(im, str(img_id), (x, y), font, 1, (0, 255, 0), 1)
cv2.imshow('im', im)
if cv2.waitKey(10) & 0xFF == ord('q'):
break

cam.release()
cv2.destroyAllWindows()

简单的一个人脸识别就完成了,只能说准确率没有非常高。

之后想办法进行提高。

来源:https://blog.csdn.net/Lin_QC/article/details/96889054

标签:opencv,人脸识别
0
投稿

猜你喜欢

  • python调用cmd复制文件代码分享

    2022-12-26 11:18:22
  • 编辑BLOG文章的一些好习惯

    2007-11-15 06:35:00
  • 微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解

    2023-11-18 19:09:27
  • 自己收集比较强大的分页存储过程 推荐

    2011-11-03 17:10:20
  • 费明红:什么样的404页面才是正确的?

    2009-05-21 17:47:00
  • JS二维数组的定义说明

    2023-08-23 15:09:45
  • 网站重构到底是什么

    2008-11-03 11:30:00
  • WEB标准与XHTML 1.0 Transitional等文档类型介绍

    2007-10-20 21:18:00
  • 在ASP.NET 2.0中操作数据之四十六:使用SqlDataSource控件检索数据

    2023-07-04 14:31:37
  • 互联网一家之言(一):叫用户为你买单

    2009-06-09 11:32:00
  • 用户的期望以及背后真正的需求

    2009-06-19 12:39:00
  • ProC 连接Oracle代码

    2009-06-10 18:12:00
  • ADO的错误码对应的含义

    2007-10-22 17:31:00
  • 数据库疑难讲解:改善SQL Server内存管理

    2009-10-29 13:30:00
  • CSS改变字体而不影响网页

    2010-10-20 20:11:00
  • django中上传图片分页三级联动效果的实现代码

    2022-02-26 18:39:31
  • Stored Procedure(存储过程)编写经验和优化措施

    2008-03-12 12:03:00
  • Access函数大全

    2009-12-23 19:22:00
  • QQ影音正式版官网Banner设计

    2009-03-27 18:46:00
  • Python实现基于POS算法的区块链

    2023-10-30 01:47:19
  • asp之家 网络编程 m.aspxhome.com