美文网首页图像识别PyQt5
基于 opencv 的人脸识别(1)

基于 opencv 的人脸识别(1)

作者: zidea | 来源:发表于2019-08-06 07:16 被阅读0次

    这里我们使用官方提供用于人脸和眼镜识别 xml 文件来实现人脸识别,随后我们会自己尝试定义一个自己的物体识别文件 haarcascade,用于识别一些物件。
    https://github.com/opencv/opencv/tree/master/data

    可以从本地获取 haarcascade 文件,我们 python 命令行下输入

    >>> import cv2
    >>> print(cv2.__file__)
    

    可以查看到的 cv2 的安装目录,然后用 open 命令进入该安装目录下,将包含 haarcascade 文件的data 文件夹 copy 到项目目录下也就可以使用官方提供 haarcascade 文件。

    open /usr/local/lib/python2.7/site-packages/cv2
    

    引入我们依赖 cv2

    import cv2
    import numpy as np
    

    引入 haarcascade 文件

    引入下载下来 haarcascade 文件来用于识别物体的规则

    face_dascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    eye_casc = cv2.CascadeClassifier('haarcascade_eye.xml')
    

    我们通过摄像头捕捉视频流,有关如何通过摄像头获取视频流请参照计算机视觉 OpenCV (2)

    获取分类器

    cap = cv2.VideoCapture(0)
    
    while True:
        ret, img = cap.read()
    
    

    有关 detectMultiScale 参数第一个是我们处理灰度的图像,后面两个参数是 scaleFactor=1.3 minNeighbors=5 有关这两个参数暂时不做详细解释,也可以使用默认值。识别出 face 会返回 4 值,分别为左上角的坐标和识别区域的宽度和高度。利用这些值我们可以通过矩形将人脸的范围表示出来。

    while True:
        ret, img = cap.read()
        gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        faces = face_dascade.detectMultiScale(gray,1.3,5)
    
        for(x,y,w,h) in faces:
           
            cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    

    来一个自拍

    face_cascade = cv2.CascadeClassifier('/Users/jangwoo/Desktop/Zi/opencv-demo/cascades/data/haarcascade_frontalface_alt2.xml')
    
    
    while(True):
        ret, frame = cap.read()
        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        faces = face_cascade.detectMultiScale(gray,scaleFactor=1.5,minNeighbors=5)
        for(x, y, w, h) in faces:
            print(x,y,w,h)
            roi_gray = gray[y:y+h,x:x+w]
            img_item = 'my-image.png'
            cv2.imwrite(img_item,roi_gray)
        
        cv2.imshow('frame',frame)
        k = cv2.waitKey(30) & 0xff
        if k == 27:
            break
    cap.release()
    cv2.destroyAllWindows()
    

    为了巩固上面知识我们可以来一个自拍,大家可以尝试一下。

    eye 通常都位于 face 区域内,所以我们再识别出 face 区域后,在这个区域的图像中查找 eye,工作类似于 face 的识别方法,这里就不做过多赘述了。

        roi_gray = gray[y:y+h,x:x+w]
            roi_color = img[y:y+h,x:x+w]
            eyes = eye_casc.detectMultiScale(roi_gray)
            for (ex,ey,ew,eh) in eyes:
                cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
    

    最后就是一些常规在 OpenCV 中工作,显示处理后的图像和关闭视频后进行一些必要的回收处理。

    cv2.imshow('img',img)
        k = cv2.waitKey(30) & 0xff
        if k == 27:
            break
    cap.release()
    cv2.destroyAllWindows()
    

    完整代码

    while True:
        ret, img = cap.read()
        gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        faces = face_dascade.detectMultiScale(gray,1.3,5)
        for(x,y,w,h) in faces:
            cv2.rectangle(img,(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_casc.detectMultiScale(roi_gray)
            for (ex,ey,ew,eh) in eyes:
                cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
        cv2.imshow('img',img)
        k = cv2.waitKey(30) & 0xff
        if k == 27:
            break
    cap.release()
    cv2.destroyAllWindows()
    

    提醒一下我开始带眼镜,就没有识别出我们的脸,我以为代码问题,后来摘下眼镜就 OK 而且还有一个问题就是可能把鼻孔以识别出来了。

    相关文章

      网友评论

        本文标题:基于 opencv 的人脸识别(1)

        本文链接:https://www.haomeiwen.com/subject/wiebdctx.html