前言

Python火是有他的道理的,因为他拥有特别多的第三方库,可以尽情的享用前人大佬的智慧成果,不像C/C++一样 ,几乎什么都要自己写,近一段时间在学与人脸识别,刚学出怎样识别人脸并且在短时间内保存快照到指定文件夹,下一步需要学习Tensorflow库中的神经网络实现模型训练,这俩结合之后就做好简单的人脸识别的框架了。

代码

#如果运行的时候出现cv2错误的话,检查代码和路径(尤其是路径)
import cv2
import sys
import os
import numpy as np


def Exit():
    try:
        os.mkdir('/Facedata')  # 创建目录,Reserence_Page:134
    except Exception as e:
        print("友情提示:创建目录失败,请检查目标路径的上层路径是否可写")


def Video_detected():
    '''
    从视频中进行人脸检测
    '''
    # 创建一个级联分类器,家在一个  .xml文件它既可以是Haar特征,也可以是LBP特征的分类器

    face_cascade = cv2.CascadeClassifier(
        'D:/python environment/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml')
    eye_cascade = cv2.CascadeClassifier('D:/python environment/Lib/site-packages/cv2/data/haarcascade_eye.xml')
    name = input("首先,你得说一下你叫啥名或自己的昵称吧,方便我给你命名:\n")
    # 打开摄像头
    camera = cv2.VideoCapture(0)
    cv2.namedWindow('Dynamic')
    i = 0
    count = 0
    while (True):
        # 读取一帧图像   ret
        ret, frame = camera.read()
        # 判断图片读取是否成功
        if ret:
            gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

            # gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            # 人脸检测
            faces = face_cascade.detectMultiScale(gray_img, 1.3, 5)
            for (x, y, w, h) in faces:
                # 在原图上绘制矩形
                cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)  # 蓝色
                roi_gray = gray_img[y:y + h, x:x + w]
                # 眼睛检测
                eyes = eye_cascade.detectMultiScale(roi_gray, 1.1, 5, 0, (40, 40))
                for (ex, ey, ew, eh) in eyes:
                    cv2.rectangle(frame, (ex + x, ey + y), (ex + x + ew, ey + y + eh), (0, 255, 0), 2)  # 绿色
                    count += 1
                    if count <= 10:
                        # 每次检测到脸眼睛之后,执行拍摄
                        cv2.imwrite("/Facedata/User." + str(name) + '.' + str(count) + '.jpg', gray_img)

            cv2.imshow('Dynamic', frame)
            # 如果按下q键则退出
            if cv2.waitKey(10) & 0xff == ord('q'):  # waitkey里面是以毫秒计数
                break
            # if wait==27:  #渣渣渣渣,不能使用两段语句 可能的原因:1.内存不够,机器渣渣  2.内存溢出  3.不知道。。。
            #     break

    camera.release()
    cv2.destroyAllWindows()

    # 线程强制关闭,方便下一次启动调试
    sys.exit(0)


if __name__ == '__main__':
    exit = os.path.isdir('/Facedata')
    if not exit:
        Exit()
    Video_detected()

要点

安装cv的时候出现小问题和运行时少加了斜杠。。。