opencv3 人脸检测和识别
程序员文章站
2022-07-12 20:53:32
...
人脸部检测
输入:face_detection_still.py
import cv2
from skimage import io
filename = 'people.jpg'
def detect(filename):
face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('./cascades/cascadeshaarcascade_eye.xml')
img = cv2.imread(filename)
#gray = io.imread(r"D:\F\eclipse-workspace\imagop\src\faces\vikings.jpg",as_grey=True)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#faces = face_cascade.detectMultiScale(gray, 1.3, 5)
faces = face_cascade.detectMultiScale(gray, 1.3, 9)
for (x,y,w,h) in faces:
img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
cv2.namedWindow('Vikings Detected!!')
img = cv2.resize(img, (900, 900), interpolation=cv2.INTER_CUBIC)
cv2.imshow('Vikings Detected!!', img)
cv2.imwrite('./vikings.jpg', img)
cv2.waitKey(0)
detect(filename)
输出:
检测人的脸部和眼睛
'''
Created on 2018年7月1日
@author: hcl
'''
import cv2
def detect():
face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('./cascades/haarcascade_eye.xml')
camera = cv2.VideoCapture(0)
while (True):
ret,frame = camera.read()
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
#检测人脸,注意要转换成灰度图 1.3表示压缩率 5表示保留近邻数目的最小值
for (x,y,w,h) in faces:
img = cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h,x:x+w]
roi_color = img[y:y+h,x:x+w]
eyes = eye_cascade.detectMultiScale(roi_gray,1.03,5,0,(40,40))#,0
#在上检测的人脸中检测眼睛 40*40限制对眼睛搜索的的最小尺寸
for (ex,ey,ew,eh) in eyes:
cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)#书上用的是img 会有问题
cv2.imshow('camera',frame)
if cv2.waitKey(5) & 0xff == ord('q'):
break
camera.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
detect()
输出:脸部能准确圈出,但是眼部只能圈出未佩戴眼镜者
打开摄像头在检测的人脸中显示姓名
1、首先获取人脸特征数据:
import cv2
def generate():
face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_default.xml')
# 打开摄像头
camera = cv2.VideoCapture(0)
count = 0
while (True):
ret, frame = camera.read()
print(ret)
# 把摄像头的每一帧图像转换成灰度图像,这时书上就比较乱了
# 有用cv2.cvtColor(frame, 1)也有用下面的,其实都一样
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
# 接下来就是循环保存图片了
for (x, y, w, h) in faces:
# 先画一个正方形,这很简单
img = cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 接下来把图像全部格式化成200x200像素
f = cv2.resize(gray[y: y+h, x:x+w], (200, 200))
# 保存图片为opencv专用的*.pgm格式
cv2.imwrite('./data/hcl/%s.pgm' % str(count), f)
count += 1
cv2.imshow("camera", frame)
if cv2.waitKey(int(1000/12)) & 0xff == ord("q"):
break
# 释放摄像头句柄
camera.release()
# 销毁窗口,这句很重要
cv2.destroyAllWindows()
# 开始执行
if __name__ == "__main__":
generate()
2、验证数据人脸特征数据是否生成
import cv2
# 打开1.pgm文件,并保存为灰度图像
img = cv2.imread('./data/hcl/1.pgm', cv2.IMREAD_GRAYSCALE)
print (img)
# 在名为img的窗口上显示图片,像素为200x200
cv2.imshow('img',img)
cv2.waitKey()
在运行程序中,安装了opencv的补充包opencv_contrib_python-3.4.1.15-cp36-cp36m-win_amd64.whl,在https://pypi.org/project/opencv-contrib-python/#files下载适合自己电脑安装版本的包,然后再再anaconda中安装pip install D:\F\Anaconda3\Lib\opencv_contrib_python-3.4.1.15-cp36-cp36m-win_amd64.whl即可
3、真正进入人脸识别
三种实现方式:EigenFace、FisherFace、LBPHFace
import os
import sys
import cv2
import numpy as np
# 图片的路径
filepath = './data/hcl/'
# 定义2个数组,X存放每幅图片的数组列表,y存放每幅图片的序号,后面有句print函数
# 可以在IDLE里看哪张图片特征最匹配实时检测到的脸,并给出置信度
X = []
y = []
# 顾名思义,读取特征图片
def read_images(path):
# 初始化计数器
c = 0
# 扫描路径下的路径名,文件名,不明白的可以在下面print一下
for dirname, dirnames, filenames in os.walk(path):
# print dirname, dirnames, filename
# 提取每个文件并保存到X,y数组里,这里做了点改动,因为我的特征图片路径没有书上代码那么深
for filename in filenames:
try:
# 组合路径和文件名,得到特征图的绝对路径D:\F\eclipse-workspace\imagop\src\faces\data\hcl\1.pgm
filename = os.path.join(path, filename)
# 把特征图以灰度图读取
im = cv2.imread(filename, cv2.IMREAD_GRAYSCALE)
# 重新格式化图片为200x200像素,原书估计打错字了
if (im is not None):
im = cv2.resize(im, (200, 200))
# 把特征图片数组添加到X数组中,组成一个大的特征数组
X.append(np.asarray(im, dtype=np.uint8))
y.append(c)
# 输入输出错误检查
# except IOError, (errno, strerror):
# print "I/O error({0}): {1}".format(errno, strerror)
except:
print ("Unexpected error:", sys.exc_info()[0])
raise
c = c + 1
#print X
#print y
# 估计到这,这数组的维度大得吓人了
return [X, y]
# 顾名思义,人脸检测开始了
def face_rec():
# 定义一个名字的数组,随便瞎打几个英文字母,等会下面会用到
#names = ['hcl', 'ln', 'hn']
names = ['hcl' for i in range(20)]
# 加载特征图片
[x, y] = read_images(filepath)
# 把y数组保存为int32格式的数组,用asarry()不用开辟新的内存,其实array()函数也可以,现在谁的电脑内存没个几G啊
y = np.asarray(y, dtype=np.int32)
# 加载EigenFaceRecognizer算法,这里必须改为EigenFaceRecognizer_create,原书createEigenFaceRecognizer
# 需要安装opencv扩展库,基础库只能做到人脸识别,但是分不清是谁, pip install opencv-contrib-python
#这里面是3中不同的人脸识别方法
model = cv2.face.EigenFaceRecognizer_create()
#model = cv2.face.FisherFaceRecognizer_create()
#model = cv2.face.LBPHFaceRecognizer_create()
# 训练数据集,貌似机器学习,好高深,不深究
model.train(np.asarray(X), np.asarray(y))
# 和第一步里generate()里的用法一样,懒得解释了
face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_default.xml')
camera = cv2.VideoCapture(0)
while (True):
read, img = camera.read()
faces = face_cascade.detectMultiScale(img, 1.3, 5)
for (x, y, w, h) in faces:
img = cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
roi = gray[x: x+w, y: y+h]
try:
# 选出感兴趣的区域,使用内插法,还是老规矩自行百度
roi = cv2.resize(roi, (200, 200), interpolation=cv2.INTER_LINEAR)
# 预测实时图片,这里老衲也没看明白,下次有时间去看看EigenFaceRecognizer的方法
params = model.predict(roi)
print(params)
# 把匹配的特征和置信度打印在IDLE内
print ("Label: %s, Confidence: %.2f" % (params[0], params[1]))
# 把匹配的名字显示在方框左上角,有时候会瞎显示,以后研究,还有就是现在无法显示中文字符,也以后吧 :P
#后期可以把所有不同人的照片放到一个文件夹内,然后利用 姓名+计数 命名,然后通过对params[0]进行分割 去除数字 留下姓名 这样就可以做到识别多人了
cv2.putText(img, names[params[0]], (x, y - 20), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2)
except:
continue
cv2.imshow("camera", img)
if cv2.waitKey(int(1000 / 12)) & 0xff == ord("q"):
break
cv2.destroyAllWindows()
if __name__ == "__main__":
face_rec()
识别不同人脸思路:后期可以把所有不同人的照片放到一个文件夹内,然后利用 姓名+计数 命名,然后通过对params[0]进行分割 去除数字 留下姓名 这样就可以做到识别多人了
上一篇: 学习笔记:python人脸识别3-通过web客户端摄像头识别人脸
下一篇: 炉石传说
推荐阅读
-
python3+dlib实现人脸识别和情绪分析
-
谷歌Pixel 4为上3D人脸识别和后置双摄:审美塌方
-
python人脸识别项目之基础学习(三):矩阵的基本运算 + 张量的阶和形态
-
基于jupyter notebook的python编程(Win10通过OpenCv-3.4.1进行人脸口罩数据集的模型训练并进行戴口罩识别检测)
-
专利显示苹果决心去掉刘海:iPhone集成人脸识别和屏下指纹
-
Linkface人脸检测识别:四位女创始人,号称检测算法世界第一
-
Python3结合Dlib实现人脸识别和剪切
-
基于Python实现人脸识别和焦点人物检测功能
-
Python学习笔记之图片人脸检测识别实例教程
-
古代没有照片和人脸识别 古人是如何杜绝替考的现象的