博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
opencv3 人脸检测和识别
阅读量:1860 次
发布时间:2019-04-26

本文共 7045 字,大约阅读时间需要 23 分钟。

人脸部检测

输入:face_detection_still.py

import cv2from skimage import iofilename = '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的窗口上显示图片,像素为200x200cv2.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 osimport sysimport cv2import 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]进行分割 去除数字 留下姓名 这样就可以做到识别多人了

你可能感兴趣的文章
这42个Python小例子,太走心~
查看>>
2019年机器学习/ 深度学习热门论文集锦
查看>>
深度学习环境配置有哪些坑?
查看>>
三分钟告诉你 1575119387982 是什么?
查看>>
用户行为序列推荐模型
查看>>
读研期间,通过实习和数据竞赛,年入四十万
查看>>
wide&deep 在贝壳推荐场景的实践
查看>>
天池-安泰杯跨境电商智能算法大赛(冠军)方案分享
查看>>
基于tf实现稀疏自编码和在推荐中的应用
查看>>
模型压缩 | 知识蒸馏经典解读
查看>>
只有正样本和无标记数据的半监督学习(PU Learning)
查看>>
深度学习推荐系统中各类流行的Embedding方法(上)
查看>>
深度召回在招聘推荐中的挑战和实践
查看>>
【白话机器学习】算法理论+实战之LightGBM算法
查看>>
WSDM 2020关于深度推荐系统与CTR预估工业界必读的论文
查看>>
太赞了!《Python知识手册》更新到v2.2版
查看>>
深度总结 | 多任务学习方法在推荐中的演变
查看>>
【推荐】【文末福利】机器学习最常见的30个基本概念(手绘图解)
查看>>
BERT大魔王为何在商业环境下碰壁?
查看>>
用户画像有什么用?怎样用?6个场景案例给你讲明白
查看>>