python基于opencv的人脸检测(有最详细的注释)摄像头实时检测人脸

主要实现功能:

通过opencv的模块的内置的方法打开电脑摄像头,读取每一帧数据进行分析。通过界面的方式在界面里实时更新摄像头视频并且标记出人脸。

效果图:

图1

代码:

这部分代码可以用来检测opencv的库是否安装正常。是直接调用opencv库里面调用摄像头显示图像的方法,把摄像头得到的每一帧图像直接显示在窗口里,测试代码如下:

#!/usr/bin/python3.7
# coding=utf-8

import cv2#导入opencv模块
#捕捉帧,笔记本摄像头设置为0即可
""" VideoCapture是使用摄像头的方法,
    可以有多个摄像头,多以摄像头的编号是从0开始
    VideoCapture第一个参数就是摄像头编号"""
capture = cv2.VideoCapture(0)
#循环显示帧
while(True):
    """读取解码摄像头得到的每帧图像,返回值第二个得到的每一帧图像"""
    ok, frame = capture.read()
    """显示窗口第一个参数是窗口名,第二个参数是内容"""
    cv2.imshow('Carmer', frame)
    """键盘按键等待延时,如果输入按键q,则退出窗口"""
    if cv2.waitKey(1) == ord('q'):#按Q退出
        break

如果上面的程序可以正常在窗口里显示出来摄像头拍摄的画面,那么说明可以正常使用opencv。
接下里需要去下载和安装人脸识别级联分类器opencv-CascadeClassifier
需要下载分类器:https://gitee.com/tianxiaohuahua/opencv.git
具体教程我参考了这位大神的博客:利用python、tensorflow、opencv实现人脸识别(包会)!
这里需要注意一些问题,比如在填写级联分类器的文件路径名称时候,最好使用局对路径。在使用绝对路径的时候确实麻烦了半个小时找错误。
如果你正确下载了文件,但是报错是

error(-215) !empty() in function detectMultiScale

那么有极大的可能是因为路径的原因才会有错误。需要认真的找到文件路径。

对应文章开头人脸识别以及眼睛识别的具体代码如下:

#!/usr/bin/python3.7
# coding=utf-8
import cv2
"""功能:级联分类器由若干简单分类器和一个神经网络分类器构成。
参数列表:级联分类器文件路径;
其他:  关于opencv-CascadeClassifier(级联分类器)的初步认识 https://blog.csdn.net/sazass/article/details/89150468"""
face_cascade = cv2.CascadeClassifier("/home/tianxiaohua/2PROGRAM/1-python/20.1.30-田小花语音机器人主程序/program/main/opencv/data/haarcascades/haarcascade_frontalface_default.xml") #告诉OpenCV使用人脸识别分类器
eye_cascade = cv2.CascadeClassifier("/home/tianxiaohua/2PROGRAM/1-python/20.1.30-田小花语音机器人主程序/program/main/opencv/data/haarcascades/haarcascade_eye.xml") #告诉OpenCV使用眼睛识别分类器
"""功能:对opencv级联分类器的分类
        人脸检测器(默认):haarcascade_frontalface_default.xml 
        人脸检测器(快速Harr):haarcascade_frontalface_alt2.xml 
        人脸检测器(侧视):haarcascade_profileface.xml 
        眼部检测器(左眼):haarcascade_lefteye_2splits.xml 
        眼部检测器(右眼):haarcascade_righteye_2splits.xml 
        嘴部检测器:haarcascade_mcs_mouth.xml 
        鼻子检测器:haarcascade_mcs_nose.xml 
        身体检测器:haarcascade_fullbody.xml 
        人脸检测器(快速LBP):lbpcascade_frontalface.xml
原文链接:https://blog.csdn.net/qq_42633819/article/details/81191308  """

""" 功能:cv2.VideoCapture是使用摄像头的方法,
         可以有多个摄像头,多以摄像头的编号是从0开始
参数列表: VideoCapture第一个参数就是摄像头编号"""
cap = cv2.VideoCapture(0)

"""功能:进入人脸检测,因为处理的过程是将摄像头得到的每一帧数据进行处理,并且信息实时更新!"""
while True:

    """功能:读取解码摄像头得到的每帧图像,第二个返回值是得到的每一帧图像"""
    ok, img = cap.read()

    """功能从:磁盘读取一张图片进行人脸识别标记出来
    参数列表: 图片路径
    返回值:  读取到的文件缓存
    img = cv2.imread(filepath)  # 读取图片"""

    """功能:将当前帧转换成灰度图像,输入值是摄像头得到的每一帧图像、代表灰度的参数
            灰度图像是为了减少增加识别效率,减少识别的运算量,降低计算复杂度"""
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    """功能:利用分类器识别出哪个区域为人脸
    参数列表:
            image:图像缓存文件
            scaleFactor图片缩放比例;
            minNeighbors要检测的有效点数;
            minNeighbors:对特征检测点周边多少有效点同时检测,这样可避免因选取的特征检测点太小而导致遗漏,数字越大识别精度越高;
            minSize:特征检测点的最小尺寸。
    返回值: 得到一个矩形(一个脸一个)分别是矩形的x, y, w, h(座标,长宽),
            如果是多个脸就有多个矩形,则返回值为列表,列表内包含每一个矩形的信息"""
    faces = face_cascade.detectMultiScale(image = gray,
                                          scaleFactor = 1.2,# scaleFactor图片缩放比例
                                          minNeighbors = 4,# minNeighbors要检测的有效点数,数字越大识别精度越高
                                          minSize = (32, 32) )# 特征检测点的最小尺寸

    """功能:将多个脸用框画出来"""
    if len(faces) > 0: # 大于0则检测到人脸
        for faceRect in faces: # 单独框出每一张人脸,
            x, y, w, h = faceRect # 在图像中人脸的位置和大小信息
            """功能:在图像中使用方框标记出来人脸"""
            cv2.rectangle(img = img, # 图像文件
                          pt1 = (x, y), # 方框位置
                          pt2 = (x + w, y + h), # 方框的大小
                          color = (255, 0, 0),# 方框的颜色
                          thickness = 2 ) # 方框的线宽

            """功能:把原来的图像转切割成只剩下人脸的小图像"""
            roi_color = img[y:y + h // 2, x:x + w]
            """功能:把原来的灰度图像转切割成只剩下人脸的小灰度图像"""
            roi_gray = gray[y:y + h // 2, x:x + w]
            """功能:利用利用分类器识别出哪个区域为眼睛"""
            eyes = eye_cascade.detectMultiScale(image = roi_gray, # 图像缓存文件
                                                scaleFactor = 1.1, # scaleFactor图片缩放比例
                                                minNeighbors = 1, # minNeighbors要检测的有效点数
                                                flags = cv2.CASCADE_SCALE_IMAGE, # 层叠缩放图像
                                                minSize = (2, 2)) # 特征检测点的最小尺寸

            """功能:将多个眼睛圈画出来"""
            for (ex, ey, ew, eh) in eyes:
                cv2.rectangle(img = roi_color, # 图像文件
                              pt1 = (ex, ey), # 方框位置
                              pt2 = (ex + ew, ey + eh), # 方框的大小
                              color = (0, 255, 0), # 方框的颜色
                              thickness = 2) # 方框的线宽

            """功能:在窗口里输出文字提示"""
            cv2.putText(img = img, # 图像文件
                        text = "face", # 要显示的文字
                        org = (x, y - 30),  # 座标
                        fontFace = cv2.FONT_HERSHEY_SIMPLEX,  # 字体
                        fontScale = 1,  # 字号
                        color = (255, 0, 255),  # 颜色
                        lineType = 2)  # 字的线宽

    """功能:等待10毫秒看是否有按键输入"""
    cv2.imshow(winname = "img", mat = img)
    """功能:如果输入q则退出循环"""
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

"""   
# 将当前帧保存为图片
ok, frame = cap.read()  # 读取一帧数据
img_name = '%s/%s.jpg ' %(path_name, name)
image = frame[y - 10: y + h + 10, x - 10: x + w + 10]
cv2.imwrite(img_name, image)"""

运行环境:

Ubuntu19.0
python3.7
pycharm

踩坑细节:

本来以为安装opencv的库需要很麻烦,下载了zip还去搜怎么安装,结果安装了半天也没有安装上,但是在pycharm直接搜索这个库就直接安装好了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章