OpenCV 3计算机视觉 python语言实现笔记(五)

#人脸检测和识别


#将haarcascades文件夹中所有文件辅助到cascades文件夹中

#使用OpenCV进行人脸检测
#静态图像中的人脸检测

import cv2

filename = './path/to/my/pic.jpg'

def detect(filename):
    #创建CascadeClassifier对象
    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)

detect(filename)    


#视频中的人脸检测

#对人脸绘制蓝色的矩形框,对眼睛绘制绿色的矩形框
import cv2

def detect():
    #创建检测人脸和眼睛的CascadeClassifier对象
    face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_default.xml')
    eye_cascade = cv2.CascadeClassifier('./cascades/haarcascade_eye.xml')
    
    camero = 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))
            for (ex,ey,ew,eh) in eyes:
                cv2.rectangle(img,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
            #显示这一帧图像的检测结果
            cv2.imshow("cemera",frame)
            #输入q退出
            if cv2.waitKey(1000 / 12) & 0xff == ord("q"):
                break
            camera.release()
            cv2.destroyALLWindows()
            
if __name__ == "__main__":
    detect()
    

#人脸识别

#生成人脸识别数据
#将摄像头捕获到的图像进行人脸检测,然后获得人脸区域,将人脸区域保存下来,作为数据

import cv2

def 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)
        #r人脸检测
        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/jm/%s.pgm'% str(count),f)
            count += 1
        cv2.imshow("carema",frame)
        #输入q退出
        if cv2.waitKey(1000 / 12) & 0xff == ord("q"):
            break
    
    camera.release()
    cv2.destroyALLWindows()
    
if __name__ == "__main__":
    genetate()
    

#加载数据并识别人脸

def read_images(path,sz=None):
    c = 0   #每一个文件夹中的所有的图像都是属于同一个人,不同文件夹内的图像属于不同人
    X,y = [],[]
    # 返回的是一个三元组(root,dirs,files)
    #root 所指的是当前正在遍历的这个文件夹的本身的地址
    #dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)
    #files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)
    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)
                    im = cv2.imread(filename,cv2.IMREAD_GRAYSCALE)
                    
                    if (sz is not None):
                        im = cv2.resize(im,(200,200))
                        
                    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
    return [X,y]

#基于Eigenfaces的人脸识别

def face_rec():
    names = ['Joe','Jane','Jack']
    #获得数据集
    [X,y] = read_image(sys.argv[1]) #path
    y = np.asarray(y,dtype=np.int32)
    
    #获得模型
    model = cv2.face.createEigenFaceRecognizer()
    #训练模型
    model.train(np.asarray(X),np.asarray(y))
    
    #使用摄像头捕获图像进行验证
    camera = cv2.VideoCapture(0)
    face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_default.xml')
    while (True):
        read,img = camera.read()
        gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        faces = face_cascade.detectMultiScale(gray,1.3,5)
        for (x,y,w,h) in faces:
            img = cv2.ranctangle(img,(x,y),(x+w,y+h),(255,0,0),2)
            roi = gray[y:y+h,x:x+w]
            #识别人脸
            try:
                roi = cv2.resize(roi,(200,200),interpolation=cv2.INTER_LINEAR)
                params = model.predict(roi)
                print("Label : %s,Confidencce: %.2f" % (params[0],params[1]))
                #将识别的人名写在人脸边框左上角上面
                cv2.putText(img,names[params[0]],(x,y-20),cv2.FONT_HERSHEY_SIMPLEX,1,255,2)
            expect:
                continue
        cv2.imshow("camera",img)
        if cv2.waitKey(1000 / 12) & 0xff == ord("q"):
            break
    cv2.destroyALLWindows()

#基于Fisherfaces的人脸识别

model = cv2.face.createFisherFaceRecognizer()

#基于LBPH的人脸识别
#函数参数:radius、neighbors、grib_x、grib_y以及置信度阈值
#默认值:1,8,8,8,123.0

model = cv2.face.createLBPHFaceRecognizer()


    
 
            

你可能感兴趣的:(OpenCV3,计算机视觉)