图像识别PyQt5

基于 opencv 的人脸识别(1)

2019-08-06  本文已影响0人  zidea

这里我们使用官方提供用于人脸和眼镜识别 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 而且还有一个问题就是可能把鼻孔以识别出来了。

上一篇 下一篇

猜你喜欢

热点阅读