人脸检测和认识--书OpenCV3计算机视觉

import cv2 as cv
import os
import numpy as np
import sys
#生成人脸识别数据
#1.图像是灰度格式,后缀名字是。pym
#2.图像形状是正方形
#3.图像大小要一样(如:200X200)
#产生 引起
def generate():
    path_face="C:/Users/yao/AppData/Local/Programs/Python/Python37/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml"
    path_eye="C:/Users/yao/AppData/Local/Programs/Python/Python37/Lib/site-packages/cv2/data/haarcascade_eye.xml";
    #cascade 倾斜 小瀑布 classifier 分类成分
    face_cascade=cv.CascadeClassifier(path_face)
    eye_cascade=cv.CascadeClassifier(path_eye)

    head_movie="./image/2.mp4"
    camera=cv.VideoCapture(head_movie)
    count=0
    while camera.isOpened():
        ret,frame=camera.read()
        gray=cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
        faces=face_cascade.detectMultiScale(gray,1.3,5)
        for(x,y,w,h) in faces:
            img=cv.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
            f=cv.resize(gray[y:y+h,x:x+w],(200,200))
            cv.imwrite('./data/%s.pgm'%str(count),f)
            count+=1
        cv.imshow('camera',frame)
        key = cv.waitKey(delay=1)
        if key == ord('q'):
            break
    camera.release()
    cv.destroyAllWindows()


"""
#os.walk()  https://www.runoob.com/python3/python3-comment.html
 #os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下。
 #os.walk() 方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情。

 top - - 是你所要遍历的目录的地址, 返回的是一个三元组(root, dirs, files)。

    root
    所指的是当前正在遍历的这个文件夹的本身的地址
    dirs
    是一个list ,内容是该文件夹中所有的目录的名字(不包括子目录)
    files
    同样是list, 内容是该文件夹中所有的文件(不包括子目录)
"""
#准备训练数据
def read_images(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)
            #os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。这个列表以字母顺序。 它不包括 '.' 和'..' 即使它在文件夹中。
            for filename in os.listdir(subject_path):
                try:
                    if (filename == '.directory'):
                        continue
                    filepath=os.path.join(subject_path,filename)
                    im=cv.imread(os.path.join(subject_path,filename),cv.IMREAD_GRAYSCALE)
                    #重新设置大小
                    if(sz is not None):
                        im.cv.resize(im,(200,200))
                    #array和asarray都可将结构数据转换为ndarray类型。但是主要区别就是当数据源是ndarray时,array仍会copy出一个副本,占用新的内存,但asarray不会。
                    #array 赋值关系 asarray 引用关系
                    x.append(np.asanyarray(im,dtype=np.uint8))
                    y.append(c)
                except IOError as (errno,strerror):
                    print('I.O error({0}:{1})'.format(errno,strerror))
                except:
                    print("UnEXPECTED ERROR",sys.exc_info()[0])
                    raise
            c=c+1
    return [x,y]

if __name__ =="__main__":
    print('----')
    #generate()

发布了50 篇原创文章 · 获赞 1 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/u010708028/article/details/100189547