美文网首页大数据
Python使用dlib实现人脸检测

Python使用dlib实现人脸检测

作者: AwesomeTang | 来源:发表于2019-01-01 20:14 被阅读11次

    前期准备

    在开始之前,你得先做如下准备:

    • opencv
      这个一般没啥问题,通过pip install opencv-python安装即可。
    • dlib
      安装dlib之前需要安装好cmake,之后再通过pip install dlib安装,如果报错的话,再自行百度吧,我是折腾了一下午才弄好。
    • 下载dlib提供的检测模型文件
      下载地址:http://dlib.net/files/
      文件名shape_predictor_68_face_landmarks.dat

    人脸检测

    单一图片

    代码部分实现起来非常简单,不过十几行的事,不过需要注意的是,通过cv2.imread读取的图片是BRG通道的,需要转成RGB通道,不然通过pyplot显示图片会变色。

    • 代码部分
    import cv2
    import dlib
    import matplotlib.pyplot as plt
    import numpy as np
    
    predictor_path = 'shape_predictor_68_face_landmarks.dat'
    test_img = 'test.png'
    img = cv2.imread(test_img)
    detector = dlib.get_frontal_face_detector()
    predictor = dlib.shape_predictor(predictor_path)
    
    faces = detector(img, 0)
    if len(faces):
        print '==> Found %d face in this image.' % len(faces)
        for i in range(len(faces)):
            landmarks = np.matrix([[p.x, p.y] for p in predictor(img, faces[i]).parts()])
            for point in landmarks:
                pos = (point[0, 0], point[0, 1])
                cv2.circle(img, pos, 3, color=(0, 255, 0),thickness=3)
    else:
        print 'Face not found!'
    
    # opencv读取图片是BRG通道的,需要专成RGB
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    plt.figure(figsize=(10, 8))
    plt.subplot(121)
    plt.imshow(plt.imread(test_img))
    plt.axis('off')
    plt.subplot(122)
    plt.imshow(img)
    plt.axis('off')
    plt.show()
    
    • 效果如下


      68点人脸检测
    摄像头读取

    我们可以通过cv2.VideoCapture(0)调起摄像头,camera.read会返回两个参数,第一个代表是否获取到图像帧,第二个代表图像帧内容,剩下的部分就跟上面一样了,传给dlib进行人脸检测就好了。

    • 完整代码
    # -*- coding: utf-8 -*-
    
    # @author: Awesome_Tang
    # @date: 2018-12-31
    # @version: python2.7
    
    import cv2
    import dlib
    import numpy as np
    import os
    
    
    class Config(object):
        predictor_path = 'shape_predictor_68_face_landmarks.dat'
        test_img = 'test.jpg'
        width = 640
        height = 480
    
    
    class FaceDetective():
    
        def __init__(self):
            self.detector = dlib.get_frontal_face_detector()
            self.predictor = dlib.shape_predictor(Config.predictor_path)
    
        def check_file(self,path):
            if os.path.exists(path):
                img = cv2.imread(path)
                return img
            else:
                raise IOError('No such file : "%s", please check!' % path)
    
        def detective(self, frame):
            faces = self.detector(frame, 0)
            if len(faces):
                print '==> Found %d face in this frame.' % len(faces)
                for i in range(len(faces)):
                    landmarks = np.matrix([[p.x, p.y] for p in self.predictor(frame, faces[i]).parts()])
                    for point in landmarks:
                        pos = (point[0, 0], point[0, 1])
                        cv2.circle(frame, pos, 3, color=(0, 0, 255),thickness=3)
            else:
                print 'Face not found!'
            return frame
    
        def run_camera(self):
            camera = cv2.VideoCapture(0)
            camera.set(cv2.CAP_PROP_FRAME_WIDTH, Config.width)
            camera.set(cv2.CAP_PROP_FRAME_HEIGHT, Config.height)
            while True:
                detected, frame = camera.read()
    
                if detected:
                    frame = cv2.flip(frame, 1)
                    frame = self.detective(frame)
                cv2.imshow("AwesomeTang", frame)
    
                if cv2.waitKey(1) & 0xFF == ord('q'):
                    break
    
            camera.release()
            cv2.destroyAllWindows()
    
        def single_image(self,img_path):
            img = self.check_file(img_path)
            img = self.detective(img)
            cv2.namedWindow("AwesomeTang", 0)
            cv2.resizeWindow("AwesomeTang", Config.width, Config.height)
            cv2.imshow("AwesomeTang",img)
            cv2.waitKey(0)
            cv2.destroyAllWindows()
    
    
    if __name__ == '__main__':
        p = FaceDetective()
        #p.single_image(Config.test_img)
        p.run_camera()
    
    • 效果如下



    skr~ skr~~

    相关文章

      网友评论

        本文标题:Python使用dlib实现人脸检测

        本文链接:https://www.haomeiwen.com/subject/zvznlqtx.html