opencv计算机视觉学习笔记四

来源:互联网 发布:mac怎么建文件夹 编辑:程序博客网 时间:2024/05/29 04:33

第五章 人脸检测和识别

1 haar级联的概念

2 获取haar级联数据

在opencv源码中data/haarcascades目录下存放了用于人脸检测的xml文件.用于检测静止图像,视频和摄像头中的人脸

 

用于人脸眼睛 鼻子和嘴的跟踪

haarcascade_profileface

haarcascade_smile

haarcascade_russian_plate_number

haarcascade_upperbody

haarcascade_righteye_2splits

 

 

3 使用opencv进行人脸检测

3.1 静态图像中的人脸检测

示例代码如下:

import cv2filename='../zz.jpg'def detect(filename):    #用于人脸检测xml    face_cascade=cv2.CascadeClassifier('../cascades/haarcascade_frontalface_default.xml')    #读入图像    img=cv2.imread(filename)    #更换颜色空间    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)    faces=face_cascade.detectMultiScale(gray,                                        1.3,#图像的压缩率                                        5)#人脸矩形保留邻近数目的最小值    #在原始图像上绘制蓝色矩形    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!!')    cv2.imshow("Vikings Detected!!",img)    cv2.imwrite('../vikings.jpg',img)    cv2.waitKey(0)if __name__=='__main__':    detect(filename)

 

执行结果:老同桌的脸居然识别不出来

3.2 视频中的人脸检测

 

示例代码如下:

#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time    : 2016/12/3 13:36# @Author  : Retacn# @Site    : 视频中的人脸检测# @File    : fact_detection_video.py# @Software: PyCharm__author__ = "retacn"__copyright__ = "property of mankind."__license__ = "CN"__version__ = "0.0.1"__maintainer__ = "retacn"__email__ = "zhenhuayue@sina.com"__status__ = "Development"import cv2def detect():    # 加载haar级联文件    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)        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]            #检测眼睛            # eyes = eye_cascade.detectMultiScale(roi_gray, 1.03, 5, 0, (40, 40))            eyes = eye_cascade.detectMultiScale(img, 1.03, 5, 0, (40, 40))            #绘制检测到的眼睛矩形            for (ex, ey, ew, eh) in eyes:                cv2.rectangle(img, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)            #print(x,y,w,h,ex,ey,ew,eh)        #显示图像        cv2.imshow('Camers', frame)        #按q键退出        if cv2.waitKey(1) & 0xFF == ord('q'):            break    camera.release()    cv2.destroyAllWindows()    if __name__ == '__main__':    detect()

 

 

 

3.3 人脸视别

人脸数据库:

The yale facedatabase

http://version.ucsd.edu/content/yale-face-database

 

The AT&T

http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html

 

The extendedyale or yale b

http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html

 

 

A 生成人脸数据

生成图像角本

图像像是灰度格式的.pgm文件,形状为正方式,大小要一样

示例代码如下:

#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time    : 2016/12/3 15:14# @Author  : Retacn# @Site    : 生成人脸识别数据# @File    : createData.py# @Software: PyCharm__author__ = "retacn"__copyright__ = "property of mankind."__license__ = "CN"__version__ = "0.0.1"__maintainer__ = "retacn"__email__ = "zhenhuayue@sina.com"__status__ = "Development"import cv2def generate():    face_cascade = cv2.CascadeClassifier('../cascades/haarcascade_frontalface_default.xml')    eye_cascade = cv2.CascadeClassifier('../cascades/haarcascade_eye.xml')    camera = cv2.VideoCapture(0)    count = 0    while (True):        ret, frame = camera.read()        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)            f = cv2.resize(gray[y:y + h, x:x + w], (200, 200))            cv2.imwrite('../data/at/retacn/%s.pgm' % str(count), f)            count += 1        cv2.imshow("Camera", frame)        if cv2.waitKey(33) & 0xFF == ord("q"):            break    camera.release()    cv2.destroyAllWindows()if __name__ == '__main__':    generate()

 

 

B 人脸视别

 

C 准备训练数据

生成csv文件的方法,示例代码如下:

#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time    : 2016/12/3 15:14# @Author  : Retacn# @Site    : 生成人脸识别数据# @File    : createData.py# @Software: PyCharm__author__ = "retacn"__copyright__ = "property of mankind."__license__ = "CN"__version__ = "0.0.1"__maintainer__ = "retacn"__email__ = "zhenhuayue@sina.com"__status__ = "Development"import cv2def generate():    face_cascade = cv2.CascadeClassifier('../cascades/haarcascade_frontalface_default.xml')    eye_cascade = cv2.CascadeClassifier('../cascades/haarcascade_eye.xml')    camera = cv2.VideoCapture(0)    count = 0    while (True):        ret, frame = camera.read()        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)            f = cv2.resize(gray[y:y + h, x:x + w], (200, 200))            cv2.imwrite('../data/at/retacn/%s.pgm' % str(count), f)            count += 1        cv2.imshow("Camera", frame)        if cv2.waitKey(33) & 0xFF == ord("q"):            break    camera.release()    cv2.destroyAllWindows()if __name__ == '__main__':    generate()

 

 

 

 

D 加载数据并识别人脸

示例代码如下:

# 加载识别数据def read_image(path, sz=None):    c = 0    x, y = [], []    for dirname, dirnames, filenames in os.walk(path):        for subdirname in dirnames:            subject_path = os.path.join(dirname, subdirname)            for filename in os.listdir(subject_path):                try:                    if (filename == '.directory'):                        continue                    filepath = os.path.join(subject_path, filename)                    img = cv2.imread(filepath, cv2.IMREAD_GRAYSCALE)                    if (sz is not None):                        im = cv2.resize(im, (200, 200))                    x.append(np.asanyarray(im, dtype=np.uint8))                    y.append(c)                except IOError as ioe:                    print(ioe)                except:                    print('Unexpected error:', sys.exc_info()[0])                    raise            c += 1    return [x, y]

 

E 基于eignfaces的人脸识别

示例代码如下:

#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time    : 2016/12/3 22:07# @Author  : Retacn# @Site    : TODO 需要重新编译opencv扩展包,人脸检测与识别# @File    : face_detection.py# @Software: PyCharm__author__ = "retacn"__copyright__ = "property of mankind."__license__ = "CN"__version__ = "0.0.1"__maintainer__ = "retacn"__email__ = "zhenhuayue@sina.com"__status__ = "Development"import cv2import numpy as npimport sysimport os.path# 生成人脸识别数据def generate():    face_cascade = cv2.CascadeClassifier('../data/cascades/haarcascade_frontalface_default.xml')    eye_cascade = cv2.CascadeClassifier('../data/cascades/haarcascade_eye.xml')    # 读取摄像头视频数据    camera = cv2.VideoCapture(0)    count = 0    while (True):        ret, frame = camera.read()        # 更换颜色空间        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)            f = cv2.resize(gray[y:y + h, x:x + w], (200, 200))            cv2.imwrite('../data/at/retacn/%s.pgm' % str(count), f)            count += 1        cv2.imshow("Camera", frame)        if cv2.waitKey(1000 / 12) & 0xFF == ord("q"):            break    camera.release()    cv2.destroyAllWindows()# 加载识别数据def read_image(path, sz=(200, 200)):    c = 0    x, y = [], []    for dirname, dirnames, filenames in os.walk(path):        for subdirname in dirnames:            subject_path = os.path.join(dirname, subdirname)            for filename in os.listdir(subject_path):                try:                    if (filename == '.directory'):                        continue                    filepath = os.path.join(subject_path, filename)                    img = cv2.imread(filepath, cv2.IMREAD_GRAYSCALE)                    if (sz is not None):                        img = cv2.resize(img, (200, 200))                    x.append(np.asarray(img, dtype=np.uint8))                    y.append(c)                except IOError as ioe:                    print(ioe)                except:                    print('Unexpected error:', sys.exc_info()[0])                    raise            c += 1    return [x, y]# 基于eigenfaces的人脸识别def face_rec():    names = ['Yue', 'Retacn', 'Three']    # 需要输入样本数据的存放路径    if len(sys.argv) < 2:        print('USAGE: facerec_defo.py </path/to/images> [/path/to/store/images/at]')        sys.exit()    # 读入图像数组,第二个参数为样本图像的存放位置    [x, y] = read_image(sys.argv[1])    y = np.asarray(y, dtype=np.int32)    # [x, y] = read_image('D:/workspace_pycharm/opencv3_python/data/at')    # 如果有三个参数,则将第三个参数设为输出目录    if len(sys.argv) == 3:        out_dir = sys.argv[2]    # 创建人脸识别模型    # model = cv2.face.createEigenFaceRecognizer()    # 基于Fisherfaces的人脸识别    # model = cv2.face.createFisherFaceRecognizer()    # 基于lbph的人脸识别    model = cv2.face.createLBPHFaceRecognizer()    model.train(np.asarray(x), np.asarray(y))    camera = cv2.VideoCapture(0)    face_cascade = cv2.CascadeClassifier('../data/cascades/haarcascade_frontalface_default.xml')    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)                # roi = cv2.resize(gray, (200, 200), interpolation=cv2.INTER_LINEAR)                # 置信度评分                params = model.predict(roi)                print(params)                print('Lable:%s,Confidence:%02f' % (params[0], params[1]))                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(33) & 0xFF == ord('q'):            break    cv2.destroyAllWindows()if __name__ == '__main__':    # generate()    # [X, y] = read_image('D:/workspace_pycharm/opencv3_python/data/at')    face_rec()    # generate()

 

 

 

 

 

 

 

F 基于fisherfaces的人脸识别

#基于Fisherfaces的人脸识别
   #model=cv2.face.createFisherFaceRecognizer()

G 基于LBPH的人脸识别

#基于lbph的人脸识别# model=cv2.face.createLBPHFaceRecognizer()

 

H 通过置信度评分来丢弃结果

Predict()

 

 

 

0 0
原创粉丝点击