1 Star 0 Fork 8

欣欣然阿/opencv

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
_12人脸识别.py 5.14 KB
一键复制 编辑 原始数据 按行查看 历史
[email protected] 提交于 2022-02-26 18:26 . Initial commit
# -*- coding: utf-8 -*-
"""
Created on Thu Aug 16 19:41:19 2018
@author: lenovo
"""
'''
调用opencv库实现人脸识别
'''
import numpy as np
import cv2
import os
import shutil
#读取pgm图像,并显示
def ShowPgm(filepath):
cv2.namedWindow('pgm')
img = cv2.imread(filepath)
cv2.imshow('pgm',img)
print(img.shape)
cv2.waitKey(0)
cv2.destroyAllWindows()
#1、生成自己人脸识别数据
def generator(data):
'''
生成的图片满足以下条件
1、图像是灰度格式,后缀为.pgm
2、图像大小要一样
params:
data:指定生成的人脸数据的保存路径
'''
'''
打开摄像头,读取帧,检测帧中的人脸,并剪切,缩放
'''
name = input('my name:')
#如果路径存在则删除
path = os.path.join(data,name)
if os.path.isdir(path):
#os.remove(path) #删除文件
#os.removedirs(path) #删除空文件夹
shutil.rmtree(path) #递归删除文件夹
#创建文件夹
os.mkdir(path)
#创建一个级联分类器 加载一个 .xml 分类器文件. 它既可以是Haar特征也可以是LBP特征的分类器.
face_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_default.xml')
#打开摄像头
camera = cv2.VideoCapture(0)
cv2.namedWindow('Dynamic')
#计数
count = 1
while(True):
#读取一帧图像
ret,frame = camera.read()
#判断图片读取成功?
if ret:
gray_img = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
#人脸检测
faces = face_cascade.detectMultiScale(gray_img,1.3,5)
for (x,y,w,h) in faces:
#在原图像上绘制矩形
cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
#调整图像大小 和ORL人脸库图像一样大小
f = cv2.resize(frame[y:y+h,x:x+w],(92,112))
#保存人脸
cv2.imwrite('%s/%s.pgm'%(path,str(count)),f)
count += 1
cv2.imshow('Dynamic',frame)
#如果按下q键则退出
if cv2.waitKey(100) & 0xff == ord('q') :
break
camera.release()
cv2.destroyAllWindows()
#2、读取ORL人脸数据库 准备训练数据
def LoadImages(data):
'''
加载数据集
params:
data:训练集数据所在的目录,要求数据尺寸大小一样
ret:
images:[m,height,width] m为样本数,height为高,width为宽
names:名字的集合
labels:标签
'''
images = []
labels = []
names = []
label = 0
#过滤所有的文件夹
for subDirname in os.listdir(data):
subjectPath = os.path.join(data,subDirname)
if os.path.isdir(subjectPath):
#每一个文件夹下存放着一个人的照片
names.append(subDirname)
for fileName in os.listdir(subjectPath):
imgPath = os.path.join(subjectPath,fileName)
img = cv2.imread(imgPath,cv2.IMREAD_GRAYSCALE)
images.append(img)
labels.append(label)
label += 1
images = np.asarray(images)
labels = np.asarray(labels)
return images,labels,names
def FaceRec(data):
#加载训练数据
X,y,names=LoadImages('./face')
model = cv2.face.EigenFaceRecognizer_create()
model.train(X,y)
#创建一个级联分类器 加载一个 .xml 分类器文件. 它既可以是Haar特征也可以是LBP特征的分类器.
face_cascade = cv2.CascadeClassifier('./haarcascades/haarcascade_frontalface_default.xml')
#打开摄像头
camera = cv2.VideoCapture(0)
cv2.namedWindow('Dynamic')
while(True):
#读取一帧图像
ret,frame = camera.read()
#判断图片读取成功?
if ret:
gray_img = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
#人脸检测
faces = face_cascade.detectMultiScale(gray_img,1.3,5)
for (x,y,w,h) in faces:
#在原图像上绘制矩形
frame = cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray_img[y:y+h,x:x+w]
try:
#宽92 高112
roi_gray = cv2.resize(roi_gray,(92,112),interpolation=cv2.INTER_LINEAR)
params = model.predict(roi_gray)
print('Label:%s,confidence:%.2f'%(params[0],params[1]))
cv2.putText(frame,names[params[0]],(x,y-20),cv2.FONT_HERSHEY_SIMPLEX,1,255,2)
except:
continue
cv2.imshow('Dynamic',frame)
#如果按下q键则退出
if cv2.waitKey(100) & 0xff == ord('q') :
break
camera.release()
cv2.destroyAllWindows()
if __name__=='__main__':
#ShowPgm('./face/s1/1.pgm')
data = './face'
#生成自己的人脸数据
#generator(data)
FaceRec(data)
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/top_xiong/opencv.git
[email protected]:top_xiong/opencv.git
top_xiong
opencv
opencv
master

搜索帮助