zoukankan      html  css  js  c++  java
  • opencv人脸检测

    Haar特征+Adaboost级联分类器

    from imutils import *
    image = imread('face.png')
    show(image)
    """
    1 image:输入图像
    2 scaleFactor=1.1:这个是每次缩小图像的比例,默认是1.1
    3 minNeighbors=3:匹配成功所需要的周围矩形框的数目,每一个特征匹配到的区域都是一个矩形框,只有多个矩形框同时存在的时候,才认为是匹配成功,比如人脸,这个默认值是3。
    4 minSize:匹配人脸的最小范围
    5 flags=0:可以取如下这些值:
    6 CASCADE_DO_CANNY_PRUNING=1, 利用canny边缘检测来排除一些边缘很少或者很多的图像区域
    7 CASCADE_SCALE_IMAGE=2, 正常比例检测
    8 CASCADE_FIND_BIGGEST_OBJECT=4, 只检测最大的物体
    9 CASCADE_DO_ROUGH_SEARCH=8 初略的检测
    """
    
    def facedetect(image):
        image = imread(image)
        # 级联分类器
        detector = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
        rects = detector.detectMultiScale(image, scaleFactor=1.1, minNeighbors=2, minSize=(10,10), flags=cv2.CASCADE_SCALE_IMAGE)
    
        for (x,y,w,h) in rects:
            # 画矩形框
            cv2.rectangle(image, (x,y), (x+w,y+h), (0,255,0), 2)
    
        show(image)
    if __name__=='__main__':
        facedetect('Solvay.jpg')
    ##了解一下就好反正精度也不高
    
    # 系统操作
    import os
    # 判断文件类型
    import imghdr
    from imutils import *
    
    #1.采集人脸样本
    
    # 人脸检测并保存人脸
    def facedetect(image, output):
        # 获取文件名
        name = os.path.basename(image)
        # 读入图片
        image = cv2.imread(image)
        # 变成灰度图
        image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        # 级联分类器,检测人脸
        detector = cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")
        rects = detector.detectMultiScale(image, scaleFactor=1.1, minNeighbors=3, minSize=(20, 20), flags=cv2.CASCADE_SCALE_IMAGE)
        # 循环每个人脸
        for (x,y,w,h) in rects:
            # 截取人脸,并且都转化为200*200的固定大小
            f = cv2.resize(image[y:y+h, x:x+w], (200,200))
            # 写入指定路径
            cv2.imwrite(os.path.join(output, name), f)
    # 检测并截取人脸
    def predict_face(path, output):
        # 如果该文件夹不存在则创建文件夹
        if not os.path.exists(output):
            os.makedirs(output)
        # 循环每个人物的文件夹下的图片
        for files in os.listdir(path):
            # 检测是不是文件夹
            if os.path.isdir(os.path.join(path, files)):
                # 定义截取到的人脸的输出路径
                output2 = os.path.join(output, files)
                # 如果该文件夹不存在则创建文件夹
                if not os.path.exists(output2):
                    os.makedirs(output2)
                # 人物文件夹的完整路径
                files = os.path.join(path, files)
                # 循环每个人的每张照片
                for file in os.listdir(files):
                    # 照片完整路径
                    file = os.path.join(files, file)
                    # 检测人脸并保存
                    facedetect(file, output2)
    #2.生成label
    # 生成label文件
    def get_label(path):
        fh = open("label.txt", 'w')
        # 表示人脸label
        label = 0
        for root, dirs, files in os.walk(path):
            # 循环每个文件夹
            for subdir in dirs:
                # 文件夹完整路径
                subdir_path = os.path.join(root,subdir)
                # 循环每个人物文件夹下面每张照片
                for file in os.listdir(subdir_path):
                    # 照片完整路径
                    filepath = os.path.join(subdir_path, file)
                    # 判断文件类型是不是图片类型
                    imgType = imghdr.what(filepath)
                    if imgType == 'jpeg' or imgType == 'png':
                        # 保存图片路径
                        fh.write(filepath);
                        fh.write(";")
                        # 标签
                        fh.write(str(label))
                        fh.write("
    ")
                # 每个人的标签不一样,从0开始计数
                label = label + 1            
        fh.close()
    
    #3.训练自己的数据模型
    # 保存图片数据
    images = []
    # 保存标签
    labels = []
    # 打开文件
    fh = open("label.txt")
    # 循环每一行
    for line in fh:
        # 以;切分字符串
        arr = line.split(";")
        # 第0部分为图片路径,读取文件
        img = cv2.imread(arr[0],0)
        # 保存图片数据
        images.append(img)
        # 保存对应的标签数据
        labels.append(int(arr[1]))
        
    # 安装opencv扩展包
    # pip install opencv-contrib-python
    # 定义人脸识别模型
    model = cv2.face.EigenFaceRecognizer_create()
    # model = cv2.face.FisherFaceRecognizer_create()
    # model = cv2.face.LBPHFaceRecognizer_create()
    # 训练模型
    model.train(np.array(images), np.array(labels))
    # 保存模型
    model.save("predict_face_XiaoMing_AB.xml")
    
    #4.人脸识别
    
    # 定义人物名字
    name= ['ab','xiaoming']
    # 定义人脸识别模型
    model = cv2.face.EigenFaceRecognizer_create()
    # 载入训练好的模型
    model.read('predict_face_XiaoMing_AB.xml')
    
    # 读入测试图片来做测试
    for file in os.listdir('test'):
        file = os.path.join('test', file)
        # 判断文件类型
        imgType = imghdr.what(file)
        if imgType == 'jpeg' or imgType == 'png':
            # 读入图片
            image = imread(file)
            # 变为灰度图
            gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
            # 级联分类器
            detector = cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")
            rects = detector.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(20, 20), flags=cv2.CASCADE_SCALE_IMAGE)
            # 循环每个人脸
            for (x,y,w,h) in rects:
                # 画矩形框
                cv2.rectangle(image, (x,y), (x+w,y+h), (0,255,0), 2)
                # 人脸识别
                face = cv2.resize(gray[y:y+h,x:x+w], (200,200))
                # 预测人物
                params = model.predict(face)
                # 写上人物名字
                cv2.putText(image,name[params[0]],(x,y-20),cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,0),2)
            show(image)
  • 相关阅读:
    Android 音视频开发(六): MediaCodec API 详解
    Android 音视频开发(五):使用 MediaExtractor 和 MediaMuxer API 解析和封装 mp4 文件
    Android 音视频开发(四):使用 Camera API 采集视频数据
    Android 音视频开发(三):使用 AudioTrack 播放PCM音频
    Android 音视频开发(二):使用 AudioRecord 采集音频PCM并保存到文件
    Android 音视频开发(一) : 通过三种方式绘制图片
    Android 使用View绘制文字(DrawText)技术总结
    Mac OS 中安装 autoconf 和 automake
    Android 自定义 View 绘制
    关于 Socket 设置 setSoTimeout 误用的说明
  • 原文地址:https://www.cnblogs.com/yunshangyue71/p/13584434.html
Copyright © 2011-2022 走看看