精华内容
下载资源
问答
  • 主要介绍了Python OpenCV调用摄像头检测人脸并截图,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 本书全面、系统地介绍“刷脸”背后的技术,包括人脸检测人脸识别、人脸检索相关的算法原理和实现技术。本书中讲解的算法具有高度的可操作性和实用性。通过学习本书,研究人员、工程师能够在3~5个月内,系统了解、...
  • 本书全面、系统地介绍“刷脸”背后的技术,包括人脸检测人脸识别、人脸检索相关的算法原理和实现技术。本书中讲解的算法具有高度的可操作性和实用性。通过学习本书,研究人员、工程师能够在3~5个月内,系统了解、...
  • Android前置摄像头预览并检测人脸,获取人脸区域亮度,对应的博客是:http://blog.csdn.net/yubo_725/article/details/50313489
  • 人脸检测 人脸姿态 人脸识别 人脸对比 人脸检索
  • 本文主要介绍使用Google自带的FaceDetectionListener进行人脸检测,并将检测到的人脸用矩形框绘制出来。详见博文:http://blog.csdn.net/yanzi1225627/article/details/38098729
  • 代码解析参见:https://handsome-man.blog.csdn.net/article/details/102546634
  • 基本原理是先通过MTCNN检测人脸的五个关键点,再把原图中人脸区域外扩100%(这样做的目的是保证对齐后图片中没有黑色区域,当然这个外扩的比例是看对齐效果自己可以调节的,我这里设置的100%)。最后的人脸对齐...
  • 这是用matlab语言编写的一段代码,可以在一幅图片上将人脸检测出来,并用矩形框框起来,然后裁剪下来,另存为图片。
  • AI人脸检测 人脸识别

    2019-11-18 14:57:08
    AI人脸检测 AI人脸识别
  • 检测人脸识别、人脸检索相关的算法原理和实现技术。本书中讲解的 算法具有很强的可操作性和实用性。通过学习本书,研究人员、工程师 能够在3~5个月内,系统了解、掌握人脸检测人脸识别、人脸检索相 关的原理和...
  • opencv3.1+VS2015 C++,因之前很多范例下载后都无法编译,为便于其他opencv编码的新人参考。特此上传。 从摄像头的视频检测人脸,并截取第一个人脸到另一个小窗口以便于进一步的人脸识别。
  • 刷脸背后 人脸检测 人脸识别 人脸检索 - 张重生 pdf版
  • //检测人脸 //detectMultiScale函数中smallImg表示的是要检测的输入图像为smallImg,faces表示检测到的人脸目标序列,1.1表示 //每次图像尺寸减小的比例为1.1,2表示每一个目标至少要被检测到3次才算是真的目标...
  • opencv3视频中检测人脸python 检测视频中主播人脸
  • 利用OpenCV检测人脸(python实现)

    万次阅读 多人点赞 2019-06-01 23:04:52
    摘要:人脸识别(Face Recognition)是当前一项非常热门...本文详细介绍如何使用python实现图片中人脸、眼睛的检测,并标记出来(如图),文中给出了全部代码,主要内容如下:OpenCV haar分类器、人脸标记、完整代码。
    图片展示

    摘要:人脸识别(Face Recognition)是当前一项非常热门的研究领域。这里介绍采用图像处理中的强大工具OpenCV实现简单的图片中人脸的检测,并在图像中标记出感兴趣区域(region of interest)。本文详细介绍如何使用python实现图片中人脸、眼睛的检测,并标记出来(如图),文中给出了全部代码,主要内容如下:

    点击跳转至全部文件下载页


    1. 前言

        前段时间自制了个人脸表情识别软件,许多步骤用到了OpenCV中的函数和功能,其中就包括人脸图像检测与定位。作为人脸表情识别的第一步需要在输入图像中找到人脸确切的位置,而OpenCV中的haar分类器可以简单方便地解决这一预处理问题。接下来详细介绍图片中人脸的检测和标记实现过程。


    2. OpenCV haar分类器

        Haar-like特征最早是由Papageorgiou等人用于物体检测的数字图像特征,而ViolaJones在此基础上,使用3种类型4种形式的特征。

        Haar特征分为三类:边缘特征、线性特征、中心特征和对角线特征,组合成特征模板。特征模板内有白色和黑色两种矩形,并定义该模板的特征值为白色矩形像素和减去黑色矩形像素和。Haar特征值反映了图像的灰度变化情况。例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。但矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述特定走向(水平、垂直、对角)的结构。
        这类矩形特征模板由两个或多个全等的黑白矩形相邻组合而成,而矩形特征值是白色矩形的灰度值的和减去黑色矩形的灰度值的和,矩形特征对一些简单的图形结构,如线段、边缘比较敏感。如果把这样的矩形放在一个非人脸区域,那么计算出的特征值应该和人脸特征值不一样,所以这些矩形就是为了把人脸特征量化,以区分人脸和非人脸。

        以Haar特征分类器为基础的对象检测技术是一种非常有效的对象检测技术,但其实并不新颖,不过因为技术成熟好用这里依然采用这一方法。它是基于机器学习的,使用大量的正负样本训练得到分类器。其实就是基于对人脸特征的描述,分类器根据训练的样品数据进行训练,完成后即可感知读取到的图片上的特征,进而对图片进行人脸识别。

        OpenCV已在GitHub训练结果网址上分享了其训练好的结果数据,分类器普适性较好可满足一般人脸检测的需要,调用的代码如下:

    import cv2
    face_cascade = cv2.CascadeClassifier(r'./haarcascade_frontalface_default.xml')
    

        通过以上代码可以得到一个训练好的人脸检测分类器,其中的xml文件可在GitHub训练结果网址上下载得到,下一步就是检测图片中的人脸,在OpenCV中调用的代码如下:

    # 检测脸部
    faces = face_cascade.detectMultiScale(gray, 
    		scaleFactor=1.1, 
    		minNeighbors=5, 
    		minSize=(30, 30),
            flags=cv2.CASCADE_SCALE_IMAGE)
    print('Detected ', len(faces), " face")
    # 在图片中显示检测到的人脸数
    label = 'Result: Detected ' + str(len(faces)) +" faces !"
    cv2.putText(img, label, (10, 20),
               cv2.FONT_HERSHEY_SCRIPT_COMPLEX, 
               0.8, (0, 0, 0), 1)
    # 显示图片
    cv2.imshow('img', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

        通过以上代码可以得到检测出的人脸数据,其中faces中包含了检测到的所有人脸区域的起始点位置及区域大小,可以通过遍历该变量获得每张人脸的检测具体数据并据此标记人脸位置。上面代码运行的几个如下图所示:

    图片展示

        以上代码中用到了putText函数,如下代码中各参数依次是:图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细

    cv2.putText(img, label, (10, 20),
               cv2.FONT_HERSHEY_SCRIPT_COMPLEX, 
               0.8, (0, 0, 0), 1)
    

        


    3. 人脸标记

        上一节中可知分类器的detectMultiScale方法可以得到检测出的人脸区域,这一节就可以据此对人脸进行标记,在此之前先读入一张图片并调整为灰度图,代码如下:

    import cv2
    face_cascade = cv2.CascadeClassifier('haarcascade_files/haarcascade_frontalface_default.xml')
    eye_cascade = cv2.CascadeClassifier('haarcascade_files/haarcascade_eye.xml')
    
    img = cv2.imread('west.jpeg')# 读取图像
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转为灰度图
    
    # 检测脸部
    faces = face_cascade.detectMultiScale(gray,
                                scaleFactor=1.1,
                                minNeighbors=5,
                                minSize=(30, 30),
                                flags=cv2.CASCADE_SCALE_IMAGE)
    print('Detected ', len(faces), " face")
    

        接下来对脸部区域进行标记,利用OpenCV中的rectanglecircle函数可以在图像中添加自定义的矩形、圆形标记,对检测结果区域进行标记的代码如下:

    # 标记位置
    for (x, y, w, h) in faces:
        img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 1)
        # cv2.circle(img, (int((x + x + w) / 2), int((y + y + h) / 2)), int(w / 2), (0, 255, 0), 1)
        roi_gray = gray[y: y + h, x: x + w]
        roi_color = img[y: y + h, x: x + w]
    
        eyes = eye_cascade.detectMultiScale(roi_gray)
        for (ex, ey, ew, eh) in eyes:
            cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 1)
    

        以上代码同时检测和标记了眼睛的位置,同样的使用的是OpenCV中得到的分类器,可以得到眼睛的位置并用长方形的颜色框标出来。代码通过遍历检测到的人脸数据,对每个人脸进行标记,并在每个人脸上检测眼睛的位置标识出来。通过如下代码显示图片:

    label = 'Result: Detected ' + str(len(faces)) +" faces !"
    cv2.putText(img, label, (10, 20),
                cv2.FONT_HERSHEY_SCRIPT_COMPLEX, 
                0.8, (0, 0, 0), 1)
    cv2.imshow('img', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    运行结果如下图所示:

    图片展示

    4. 完整代码

        要使用博文中的代码需先安装OpenCV库,可直接下载或通过在终端输入如下代码安装:

    pip install opencv-python  
    

    为方便大家使用参考,在此贴出全部的完整代码(需自行准备图片):

    # encoding:utf-8
    import cv2
    import numpy as np
    
    # 运行之前,检查cascade文件路径是否在相应的目录下
    face_cascade = cv2.CascadeClassifier('haarcascade_files/haarcascade_frontalface_default.xml')
    eye_cascade = cv2.CascadeClassifier('haarcascade_files/haarcascade_eye.xml')
    
    # 读取图像
    img = cv2.imread('lovers.jpg')
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转为灰度图
    
    
    # 检测脸部
    faces = face_cascade.detectMultiScale(gray,
                                scaleFactor=1.1,
                                minNeighbors=5,
                                minSize=(30, 30),
                                flags=cv2.CASCADE_SCALE_IMAGE)
    print('Detected ', len(faces), " face")
    
    
    # 标记位置
    for (x, y, w, h) in faces:
        img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 1)
        # cv2.circle(img, (int((x + x + w) / 2), int((y + y + h) / 2)), int(w / 2), (0, 255, 0), 1)
        roi_gray = gray[y: y + h, x: x + w]
        roi_color = img[y: y + h, x: x + w]
    
        eyes = eye_cascade.detectMultiScale(roi_gray)
        for (ex, ey, ew, eh) in eyes:
            cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 1)
    
    
    label = 'Result: Detected ' + str(len(faces)) +" faces !"
    cv2.putText(img, label, (10, 20),
                            cv2.FONT_HERSHEY_SCRIPT_COMPLEX, 
                            0.8, (0, 0, 0), 1)
    cv2.imshow('img', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    【下载链接】
        若您想获得博文中涉及的实现完整全部程序文件(包括图片,py, xml文件等),这里已打包上传至博主的CSDN下载资源中,下载后运行test.py文件即可运行。文件下载链接如下:
    文件情况
    下载链接:博文中涉及的完整程序文件

    公众号获取
        本人微信公众号已创建,扫描以下二维码并关注公众号“AI技术研究与分享”,后台回复“FR20190601”即可获取全部资源文件。


    5. 结束语

        由于博主能力有限,博文中提及的方法与代码即使经过测试,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。

        大家的点赞和关注是博主最大的动力,博主所有博文中的代码文件都可分享给您,如果您想要获取博文中的完整代码文件,可通过C币或积分下载,没有C币或积分的朋友可在关注、点赞博文后提供邮箱,我会在第一时间发送给您。

    展开全文
  • java人脸检测

    2018-10-29 16:50:06
    是用javacv实现了调用摄像头-检测人脸-保存检测成功后的照片-关闭摄像头
  • 本资源主要给小伙伴们介绍了如果使用系统自带的人脸检测功能检测人脸,并结合一个简单的自定义view,将其绘制在屏幕上需要主要的是,系统所返回的人脸信息中使用的坐标系,我们需要进行转换成安卓屏幕坐标系后才能...
  • Python:利用opencv和dlib批量检测人脸并裁剪和对齐 受益于其他博主,也记录一下平时遇到的一些困难和解决方法,希望能帮到他人,感谢博客和博主们! 本文主要是把现有的人脸数据集中的人脸部分给裁剪出来,只需要...

    Python:利用opencv和dlib批量检测人脸并裁剪和对齐

    受益于其他博主,也记录一下平时遇到的一些困难和解决方法,希望能帮到他人,感谢博客和博主们!

    本文主要是把现有的人脸数据集中的人脸部分给裁剪出来,只需要其中的人脸,再利用仿射矩阵把裁剪的人脸矫正,也就是对齐。以便后续进行自己的模型训练。

    代码

    
    ```python
    #-*-coding:gb2312-*-
    import dlib
    import face_recognition
    import math
    import numpy as np
    import cv2
    import sys
    import os
    from os.path import basename
    
     
    def rect_to_bbox(rect):
        """获得人脸矩形的坐标信息"""
        # print(rect)
        x = rect[3]
        y = rect[0]
        w = rect[1] - x
        h = rect[2] - y
        return (x, y, w, h)
     
     
    def face_alignment(faces):
        # 预测关键点
        #print("进行对齐-----")
        predictor = dlib.shape_predictor("model/shape_predictor_68_face_landmarks.dat")
        faces_aligned = []
        for face in faces:
            rec = dlib.rectangle(0, 0, face.shape[0], face.shape[1])
            shape = predictor(np.uint8(face), rec)
            # left eye, right eye, nose, left mouth, right mouth
            order = [36, 45, 30, 48, 54]
            for j in order:
                x = shape.part(j).x
                y = shape.part(j).y
            # 计算两眼的中心坐标
            eye_center =((shape.part(36).x + shape.part(45).x) * 1./2, (shape.part(36).y + shape.part(45).y) * 1./2)
            dx = (shape.part(45).x - shape.part(36).x)
            dy = (shape.part(45).y - shape.part(36).y)
            # 计算角度
            angle = math.atan2(dy, dx) * 180. / math.pi
            # 计算仿射矩阵
            RotateMatrix = cv2.getRotationMatrix2D(eye_center, angle, scale=1)
            # 进行仿射变换,即旋转
            RotImg = cv2.warpAffine(face, RotateMatrix, (face.shape[0], face.shape[1]))
            faces_aligned.append(RotImg)
        return faces_aligned
     
     
    def test(img_path):
        unknown_image = face_recognition.load_image_file(img_path)
        # 定位图片中的人脸
        face_locations = face_recognition.face_locations(unknown_image)
        # 提取人脸区域的图片并保存
        src_faces = []
        src_face_num = 0
        for (i, rect) in enumerate(face_locations):
            src_face_num = src_face_num + 1
            (x, y, w, h) = rect_to_bbox(rect)
            detect_face = unknown_image[y:y+h, x:x+w]
            src_faces.append(detect_face)
            #detect_face = cv2.cvtColor(detect_face, cv2.COLOR_RGBA2BGR)
            #cv2.imwrite("result/face_" + str(src_face_num) + ".jpg", detect_face)
        # 人脸对齐操作并保存
        len_srcfaces = len(src_faces)
        print("检测到该图片的人脸数:",len_srcfaces)
        
        faces_aligned = face_alignment(src_faces)
        len_alignedfaces = len(faces_aligned) 
        print("对齐的人脸数:",len_alignedfaces)
         
        #判断:如果这张图片没有检测到人脸,将图片的路径记录到日志文本中
        if len_srcfaces == 0 and len_alignedfaces == 0:
            print("该输入图片未检测到人脸,将其写入文本中---")
            print(img_path,file=open("fail.txt","a"))
            
      
        fileName = basename(img_path)
        face_num = 0
        for faces in faces_aligned:
            face_num = face_num + 1
            #faces = cv2.cvtColor(faces, cv2.COLOR_RGBA2BGR)
            resize_image = cv2.resize(faces,(96,96))
            cv2.imwrite("result/NIR/"+fileName, resize_image)
        pass
     
     
    if __name__ == '__main__':
        #单张图片检测
        #image_file = sys.argv[1]
        #test(image_file)
        #批量图片检测,path为你的图片路径
        path = 'data/NIR-VIS/NIR/'
        filelist = os.listdir(path)
        #定义一个变量用于计数,你输入的图片个数
        i = 0
        for file in filelist:
            i = i+1
            img_path = path + file
            print("第{}张图片 {}".format(i,img_path))
            test(img_path)        
    
        #print(filelist)
        print("---------------OVER------------- !!! ")
        pass
    
    
    
    
    

    模型链接

    dlib模型
    这里面包含很多模型,随意选择,本文选择的是68特征点检测模型。

    最后关于没有检测到的人脸的图片

    1.可以选择换一个人脸检测算法
    2.自己动手人工裁剪~

    展开全文
  • 通过opencv的模块的内置的方法打开电脑摄像头,读取每一帧数据进行分析。通过界面的方式在界面里实时更新摄像头视频并且标记出人脸。运行环境:Ubuntu19.0、python3.7、pycharm

    主要实现功能:

    通过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直接搜索这个库就直接安装好了!

    展开全文
  • 【opencv人脸识别】从视频中检测人脸 1.从视频中识别人脸和人的眼睛 2. 从视频中检测人脸、眼睛、鼻子、嘴巴 上一节,讲了如何从图片中检测人脸,这一节讲如何从视频中检测人脸。在opencv自带的说明中便有从...

    【opencv人脸识别】从视频中检测人脸

        1.从视频中识别人脸和人的眼睛

        2. 从视频中检测人脸、眼睛、鼻子、嘴巴

     

        上一节,讲了如何从图片中检测人脸,这一节讲如何从视频中检测人脸。 在opencv自带的说明中便有从视频中检测人脸的例子,在..\opencv3_4\opencv\sources\samples\cpp\tutorial_code\objectDetection\文件夹下有objectDetection.cpp,将此例子稍作修改,就可以为我们所用。

    1.从视频中识别人脸和人的眼睛

        关于视频的操作,主要如下:

        定义摄像头->打开摄像头->读取视频帧->转而为对图片的操作(一帧就相当于一幅图片)

    VideoCapture capture; //定义摄像头捕捉 变量
    Mat frame; 
    capture.open(0); //打开摄像头
    while (capture.read(frame)) //读取帧
    {
    //进行人脸检测
    //显示
    }
    

     

        视频人脸检测的代码:

     

    //face_detect_from_video.cpp 定义控制台应用程序的入口点。
    //从视频中识别人脸和人的眼睛
    #include "stdafx.h"
    #include "opencv2/objdetect.hpp"
    #include "opencv2/highgui.hpp"
    #include "opencv2/imgproc.hpp"
    
    #include <stdio.h>
    
    using namespace std;
    using namespace cv;
    
    /** Function Headers */
    void detectAndDisplay(Mat frame);
    
    /** Global variables */
    String face_cascade_name, eyes_cascade_name;
    CascadeClassifier face_cascade;
    CascadeClassifier eyes_cascade;
    String window_name = "Capture - Face detection";
    
    /** @function main */
    int main(int argc, const char** argv)
    {
    	face_cascade_name = "./xml/haarcascade_frontalface_alt.xml";
    	eyes_cascade_name = "./xml/haarcascade_eye.xml";
    	VideoCapture capture;
    	Mat frame;
    
    	//-- 1. Load the cascades
    	if (!face_cascade.load(face_cascade_name)) { printf("--(!)Error loading face cascade\n"); return -1; };
    	if (!eyes_cascade.load(eyes_cascade_name)) { printf("--(!)Error loading eyes cascade\n"); return -1; };
    
    	//-- 2. Read the video stream
    	capture.open(0); //打开摄像头
    	if (!capture.isOpened()) { printf("--(!)Error opening video capture\n"); return -1; }
    
    	while (capture.read(frame)) //读取帧
    	{
    		if (frame.empty())
    		{
    			printf(" --(!) No captured frame -- Break!");
    			break;
    		}
    
    		//-- 3. Apply the classifier to the frame
    		detectAndDisplay(frame);
    
    		if (waitKey(10) == 'k') { break; } // escape
    	}
    	return 0;
    }
    
    /** @function detectAndDisplay */
    void detectAndDisplay(Mat frame)
    {
    	std::vector<Rect> faces;
    	Mat frame_gray;
    
    	cvtColor(frame, frame_gray, COLOR_BGR2GRAY);  //BGR 转化为灰度图
    	equalizeHist(frame_gray, frame_gray);   //直方图均衡化
    
    	//-- Detect faces
    	face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(60, 60));
    
    	for (size_t i = 0; i < faces.size(); i++)
    	{
    		Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2); // 人脸中心坐标
    		ellipse(frame, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0); // 椭圆
    
    		Mat faceROI = frame_gray(faces[i]);
    		std::vector<Rect> eyes;
    
    		//-- In each face, detect eyes
    		eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
    
    		for (size_t j = 0; j < eyes.size(); j++)
    		{
    			Point eye_center(faces[i].x + eyes[j].x + eyes[j].width / 2, faces[i].y + eyes[j].y + eyes[j].height / 2); //眼睛的中心
    			int radius = cvRound((eyes[j].width + eyes[j].height)*0.25); //取整
    			circle(frame, eye_center, radius, Scalar(255, 0, 0), 4, 8, 0);
    		}
    	}
    	//-- Show what you got
    	imshow(window_name, frame);
    }
    从视频中识别人脸和人的眼睛
    #include "stdafx.h"
    #include "opencv2/objdetect.hpp"
    #include "opencv2/highgui.hpp"
    #include "opencv2/imgproc.hpp"
    
    #include <stdio.h>
    
    using namespace std;
    using namespace cv;
    
    /** Function Headers */
    void detectAndDisplay(Mat frame);
    
    /** Global variables */
    String face_cascade_name, eyes_cascade_name;
    CascadeClassifier face_cascade;
    CascadeClassifier eyes_cascade;
    String window_name = "Capture - Face detection";
    
    /** @function main */
    int main(int argc, const char** argv)
    {
    	face_cascade_name = "./xml/haarcascade_frontalface_alt.xml";
    	eyes_cascade_name = "./xml/haarcascade_eye.xml";
    	VideoCapture capture;
    	Mat frame;
    
    	//-- 1. Load the cascades
    	if (!face_cascade.load(face_cascade_name)) { printf("--(!)Error loading face cascade\n"); return -1; };
    	if (!eyes_cascade.load(eyes_cascade_name)) { printf("--(!)Error loading eyes cascade\n"); return -1; };
    
    	//-- 2. Read the video stream
    	capture.open(0); //打开摄像头
    	if (!capture.isOpened()) { printf("--(!)Error opening video capture\n"); return -1; }
    
    	while (capture.read(frame)) //读取帧
    	{
    		if (frame.empty())
    		{
    			printf(" --(!) No captured frame -- Break!");
    			break;
    		}
    
    		//-- 3. Apply the classifier to the frame
    		detectAndDisplay(frame);
    
    		if (waitKey(10) == 'k') { break; } // escape
    	}
    	return 0;
    }
    
    /** @function detectAndDisplay */
    void detectAndDisplay(Mat frame)
    {
    	std::vector<Rect> faces;
    	Mat frame_gray;
    
    	cvtColor(frame, frame_gray, COLOR_BGR2GRAY);  //BGR 转化为灰度图
    	equalizeHist(frame_gray, frame_gray);   //直方图均衡化
    
    	//-- Detect faces
    	face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(60, 60));
    
    	for (size_t i = 0; i < faces.size(); i++)
    	{
    		Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2); // 人脸中心坐标
    		ellipse(frame, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0); // 椭圆
    
    		Mat faceROI = frame_gray(faces[i]);
    		std::vector<Rect> eyes;
    
    		//-- In each face, detect eyes
    		eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
    
    		for (size_t j = 0; j < eyes.size(); j++)
    		{
    			Point eye_center(faces[i].x + eyes[j].x + eyes[j].width / 2, faces[i].y + eyes[j].y + eyes[j].height / 2); //眼睛的中心
    			int radius = cvRound((eyes[j].width + eyes[j].height)*0.25); //取整
    			circle(frame, eye_center, radius, Scalar(255, 0, 0), 4, 8, 0);
    		}
    	}
    	//-- Show what you got
    	imshow(window_name, frame);
    }
    

     

        运行结果:

     

                        

     

    2. 从视频中检测人脸、眼睛、鼻子、嘴巴

        此部分结合了之前讲的识别人脸特征:运行opencv3.4中的demo--facial_features.cpp

        将上述第一部分的从视频中识别人脸和眼睛,再加上鼻子、嘴巴的识别,可实现从视频中检测人脸特征。

        代码如下:

    //face_recog_from_video.cpp 定义控制台应用程序的入口点。
    
    #include "stdafx.h"
    #include "opencv2/objdetect.hpp"
    #include "opencv2/highgui.hpp"
    #include "opencv2/imgproc.hpp"
    
    #include <stdio.h>
    #include<iostream>
    using namespace std;
    using namespace cv;
    
    /** Function Headers */
    void detectAndDisplay(Mat frame);
    
    /** Global variables */
    String face_cascade_name, eyes_cascade_name, nose_cascade_name , mouth_cascade_name;
    CascadeClassifier face_cascade;
    CascadeClassifier eyes_cascade;
    CascadeClassifier nose_cascade;
    CascadeClassifier mouth_cascade;
    String window_name = "Capture - Face detection";
    
    /** @function main */
    int main(int argc, const char** argv)
    {
    	face_cascade_name = "./xml/haarcascade_frontalface_alt.xml";
    	eyes_cascade_name = "./xml/haarcascade_eye.xml";
    	nose_cascade_name = "./xml/haarcascade_mcs_nose.xml";
    	mouth_cascade_name = "./xml/haarcascade_mcs_mouth.xml";
    
    	VideoCapture capture;
    	Mat frame;
    
    	//-- 1. Load the cascades
    	if (!face_cascade.load(face_cascade_name)) { printf("--(!)Error loading face cascade\n"); return -1; };
    	if (!eyes_cascade.load(eyes_cascade_name)) { printf("--(!)Error loading eyes cascade\n"); return -1; };
    	if (!nose_cascade.load(nose_cascade_name)) { printf("--(!)Error loading nose cascade\n"); return -1; };
    	if (!mouth_cascade.load(mouth_cascade_name)) { printf("--(!)Error loading mouth cascade\n"); return -1; };
    
    	//-- 2. Read the video stream
    	capture.open(0); //打开摄像头
    	if (!capture.isOpened()) { printf("--(!)Error opening video capture\n"); return -1; }
    
    	while (capture.read(frame)) //读取帧
    	{
    		if (frame.empty())
    		{
    			printf(" --(!) No captured frame -- Break!");
    			break;
    		}
    
    		//-- 3. Apply the classifier to the frame
    		detectAndDisplay(frame);
    
    		if (waitKey(10) == 'k') { break; } // escape
    	}
    	return 0;
    }
    
    /** @function detectAndDisplay */
    void detectAndDisplay(Mat frame)
    {
    	std::vector<Rect> faces;
    	Mat frame_gray;
    
    	cvtColor(frame, frame_gray, COLOR_BGR2GRAY);  //BGR 转化为灰度图
    	equalizeHist(frame_gray, frame_gray);   //直方图均衡化
    
    											//-- Detect faces
    	face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(60, 60));
    
    	for (size_t i = 0; i < faces.size(); i++)
    	{
    		Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2); // 人脸中心坐标
    		ellipse(frame, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0); // 椭圆
    
    		Mat faceROI = frame_gray(faces[i]);
    		std::vector<Rect> eyes;
    		std::vector<Rect> noses;
    		std::vector<Rect> mouths;
    
    		//-- In each face, detect eyes、nose、mouth
    		eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
    		nose_cascade.detectMultiScale(faceROI, noses, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
    		mouth_cascade.detectMultiScale(faceROI, mouths, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
    
    		// eyes
    		Point eye_center;
    		for (size_t j = 0; j < eyes.size(); j++)
    		{
    			eye_center = Point(faces[i].x + eyes[j].x + eyes[j].width / 2, faces[i].y + eyes[j].y + eyes[j].height / 2); //眼睛的中心
    			if (eye_center.x>faces[i].x && eye_center.y > faces[i].y) // 确保眼睛在脸上,其实前边检测时,已经保证了这一点
    			{
    				int radius = cvRound((eyes[j].width + eyes[j].height)*0.25); //取整
    				circle(frame, eye_center, radius, Scalar(255, 0, 0), 4, 8, 0);
    			}
    		}
    		// nose
    		Point nose_center;
    		if (noses.size() > 0)
    		{
    			nose_center = Point(faces[i].x + noses[0].x + noses[0].width / 2, faces[i].y + noses[0].y + noses[0].height / 2); //鼻子的中心
    			if (nose_center.y > eye_center.y) //确保鼻子在眼睛下边
    			{
    				rectangle(frame, Point(faces[i].x + noses[0].x, faces[i].y+ noses[0].y), Point(faces[i].x + noses[0].x + noses[0].width, faces[i].y + noses[0].y + noses[0].height), Scalar(0, 255, 0), 3, 8, 0); //Point(noses[0].x, noses[0].y), Point(noses[0].x + noses[0].width, noses[0].y + noses[0].height)
    				//int radius = cvRound((noses[0].width + noses[0].height)*0.25); //取整
    				//circle(frame, nose_center, radius, Scalar(0, 255,0), 4, 8, 0);
    				std::cout << "nose!\n";
    			}
    		}
    
    		// mouth
    		if (mouths.size() > 0)
    		{
    			Point mouth_center(faces[i].x + mouths[0].x + mouths[0].width / 2, faces[i].y + mouths[0].y + mouths[0].height / 2); //嘴巴的中心
    			if (mouth_center.y > nose_center.y) // 确保嘴巴在鼻子下边
    			{
    				int radius = cvRound((mouths[0].width + mouths[0].height)*0.25); //取整
    				circle(frame, mouth_center, radius, Scalar(0, 0, 255), 4, 8, 0);
    				std::cout << "mouth!\n";
    			}
    			
    		}
    	}
    	//-- Show what you got
    	imshow(window_name, frame);
    }
    

     

        运行结果:

     

                

        由结果可看出,较好的检测出来人脸及人脸特征,其中,粉色区域为face、蓝色为eye、绿色为nose、红色为mouth。    

        但多次试验会发现,误判的概率很高,所以模型与程序尚有较大改进空间。

     注意:要对眼睛嘴巴鼻子的位置进行限定,可一定程度上减少误判。

     -------------------------------------------         END      -------------------------------------

     

    CSDN:大姨妈V 

    微信公众号:happyZhou

    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 人脸检测 该Python程序使用OpenCV库检测人脸
  • MATLAB人脸检测程序,在MATLAB环境下能够检测人脸
  • 使用OpenCV调用摄像头检测人脸并截图-Python

    万次阅读 热门讨论 2018-03-18 14:58:19
    注意:需要在python中安装OpenCV库,同时需要下载OpenCV人脸识别模型haarcascade_frontalface_alt.xml,模型可在...使用OpenCV调用摄像头检测人脸并连续截图100张 #-*- coding: utf-8...
  • 基于yolo v3的模糊人脸检测,测试代码。即可测试图片,也可测试视频。训练的模型可发邮件2750950495@qq.com给我。
  • 基于mtcnn方法实现人脸对齐,人脸检测,c++代码实现。
  • 当前,人脸口罩佩戴检测是急需的应用,而YOLOv4是最新的强悍的目标检测技术。本课程使用YOLOv4实现实时的人脸口罩佩戴检测。课程提供超万张已标注人脸口罩数据集。训练后的YOLOv4可对真实场景下人脸口罩佩戴进行高...
  • 基于SVM+HOG的人脸检测matlab程序。内含libsvm-3.22 SVM库。 资源中tgrs2013_epfifr.rar可不需要解压,可以无视。 该程序自动读取人脸库文件夹下不同人物的照片,可实现遍历文件夹及子文件夹下包含的图片,进而提取...
  • 人脸识别与目标检测

    2018-10-12 09:07:51
    目标检测人脸识别,复杂场景下均可检测小目标和复杂背景下的目标
  • 刷脸背后:人脸检测 人脸识别 人脸检索 pdf版本 人脸识别的原理

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 77,365
精华内容 30,946
关键字:

检测人脸