利用OpenCV进行简单的人脸检测

整个实现过程比较简单,先通过OpenCV调用摄像头,从视频中分

离每一帧画面;

再调用OpenCV预训练的模型face_cascade对画面进行人脸检测,检

测到人脸后,在对应帧画面上绘制绿色方框;

这里在人脸检测基础上还做了眼部检测,由于人脸已经检测到了,

只需要将检测到的人脸单独提取出来,再调用eye_cascade进行眼部

检测,同样在检测到的眼部周围绘制绿色框。

完成检测和标记后,调用OpenCV进行显示。

以下是实验代码

import cv2

# 人脸检测函数

def face_rec(img):

    # 转为灰度图

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    '''

    Haar特征分类器就是一个XML文件,该文件中会描述人体各个部位的Haar特征值。包括人脸、眼睛、嘴唇等等。

    '''

    # 创建人脸识别分类器

    face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

    # 创建人眼识别分类器

    eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

    

    '''

    opencv2中人脸检测使用的是 detectMultiScale函数;

    它可以检测出图片中所有的人脸,并将人脸用vector保存各个人脸的坐标、大小(用矩形表示);

    函数由分类器对象调用

    '''

    # 人脸检测

    '''

    void detectMultiScale(const Mat& image,

                          CV_OUT vector<Rect>& objects,

                          double scaleFactor = 1.1,

                          int minNeighbors = 3,

                          int flags = 0,

                          Size minSize = Size(),

                          Size maxSize = Size());

    1.image表示的是要检测的输入图像

    2.objects表示检测到的人脸目标序列

    3.scaleFactor表示每次图像尺寸减小的比例

    4. minNeighbors表示每一个目标至少要被检测到3次才算是真的目标

        (因为周围的像素和不同的窗口大小都可以检测到人脸)

    5.minSize为目标的最小尺寸

    6.minSize为目标的最大尺寸

    

    适当调整4,5,6两个参数可以用来排除检测结果中的干扰项

    '''

    faces = face_cascade.detectMultiScale(gray,

                                          scaleFactor  = 1.15,

                                          minNeighbors = 3,

                                          flags        = cv2.IMREAD_GRAYSCALE,

                                          minSize      = (40,40))

    # 在人脸周围绘制方框

    for (x,y,w,h) in faces:

        img = cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)

    # 进行眼部检测

    eyes = eye_cascade.detectMultiScale(gray,

                                        scaleFactor  = 1.1,

                                        minNeighbors = 3,

                                        flags = cv2.IMREAD_GRAYSCALE,

                                        minSize      = (3,3))

    for (ex,ey,ew,eh) in eyes:

        # 绘制眼部方框

        img = cv2.rectangle(frame,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)   

    cv2.imshow('result',img)

# -----------------------------------------------------------------------------

# 调整参数实现读取视频或调用摄像头

cap = cv2.VideoCapture(0)

while True:

    # 读取摄像头中的帧

    ret, frame = cap.read()

    # 调用人脸识别函数

    face_rec(frame)

    c = cv2.waitKey(10)

    # 当键盘按下‘ESC’退出程序

    if c == 27:

        break

    

cap.release()

cv2.destroyAllWindows()

  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值