基于dlib和opencv库的人脸识别

基于dlib和opencv库的人脸识别

需下载68个特征点的人脸检测模型:
http://dlib.net/files/
文件名为 shape_predictor_68_face_landmarks.dat

opencv包

img=cv2.imread(image)

功能:通过opev中的imread读取测试图片文件
参数:要读取的图片

img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

功能:转换图片格式
参数:要转换的图片,转换的方式(这里是将BRG转换为RGB)
返回值:返回转换完成的图片

cv2.circle(img,center,radius,color,thickness)

功能:画一个圆
参数:要画圆的图片,图片中的圆心坐标,半径,颜色(color=(0,255,0)),粗细(thickness=2 必须为整数)

camera=cv2.VideoCapture(0)

功能:调用摄像头

camera.set(cv2.CAP_PROP_FRAME_WIDTH, 1080)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 768)

功能:设置画面长宽

ret,frame=camera.read()

功能:获取摄像头中的每一帧的画面
返回值:ret为布尔值,如果读取帧是正确的则返回True,反之返回False;frame为每一帧的图像

frame=cv2.flip(frame,1)

功能:将获取的画面水平翻转
返回值:返回翻转后的画面

dlib包

检测器:

detector=dlib.get_frontal_face_detector()

功能:人脸检测画框
返回值:返回一个默认的人脸检测器

faces=detector(img,0)

功能:对图像画人脸框
参数:图片
返回值:人脸检测框的四点坐标

预测器:

predictor=dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

功能:标记人脸68个关键点
参数:保存的模型路径
返回值:68个人脸关键点的预测器

matplotlib包

plt.figure(figzise=(10,8))

功能:声明整个画布的大小
参数:大小(此处为长为10,宽为8)

pt.subplot(121)

功能:开始绘图
参数:代表在整个画布中,图片有1行2列,此时从第1列的图片开始绘制

plt.imshow(img)

功能:显示画布中的图片
参数:要显示的图片

plt.axis("off")

功能:结束绘图

plt.show()

功能:显示画布

图像识别代码

import cv2
import dlib
import matplotlib.pyplot as plt
import numpy as np


test_img="test.jpg"
#通过opev中的imread读取测试图片文件
img=cv2.imread(test_img)
#人脸检测画框,返回一个默认的人脸检测器
detector = dlib.get_frontal_face_detector()
#通过模型建立,返回一个标记68个人脸关键点的预测器
predictor_path="shape_predictor_68_face_landmarks.dat"
predictor = dlib.shape_predictor(predictor_path)

#对图像画人脸框,返回人脸检测矩形框4点坐标
faces=detector(img,0)

if len(faces):
    print("Found {0} faces".format(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])
            #给68个特征点都画一个圆
            cv2.circle(img, pos, 3, color=(0, 255, 0),thickness=1)
else:
    print("Face not found")

#opencv读取的图片是BRG通道的,需要转换成RGB
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

#表示figure的大小为宽为10,长为8
plt.figure(figsize=(10,8))
#12代表有图片有一行两列,1代表此时绘制第一个图
plt.subplot(121)
plt.imshow(plt.imread(test_img))
plt.axis("off")
#12代表有图片有一行两列,2代表此时绘制第二个图
plt.subplot(122)
plt.imshow(img)
plt.axis("off")
plt.show()

摄像头识别代码

import cv2
import dlib
import numpy as np

class FaceDetective():

    def __init__(self):
        # 人脸检测画框,返回一个默认的人脸检测器
        self.detector = dlib.get_frontal_face_detector()
        # 通过模型建立,返回一个标记68个人脸关键点的预测器
        self.predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

    def identify(self,frame):
        # 对图像画人脸框,返回人脸检测矩形框4点坐标
        faces=self.detector(frame,0)
        if len(faces):
            print("Found {0} face".format(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=2)
        else:
            print("Face not found")
        return frame

    def run_camera(self):
        # 调用摄像头
        camera=cv2.VideoCapture(0)
        # 设置长宽
        camera.set(cv2.CAP_PROP_FRAME_WIDTH, 1080)
        camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 768)
        while True:
            # 读取摄像头每帧的画面
            ret,frame=camera.read()
            if ret:
                # 水平翻转
                frame=cv2.flip(frame,1)
                # 对每帧的画面进行识别
                frame=self.identify(frame)
                cv2.imshow("CAM",frame)
                # 按q退出
                if cv2.waitKey(1) & 0xFF == ord('q'):
                    break
        camera.release()
        cv2.destroyAllWindows()


if __name__=='__main__':
    FaceDetective().run_camera()

之前尝试不使用类来写摄像头识别的代码,发现调用摄像头后的运行效率极低,原因可能是类的使用能够减少python内存的消耗。

【项目介绍】 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到94.5分,放心下载使用! 该资源适合计算机相关专业(如人工智能、通信工程、自动化、软件工程等)的在校学生、老师或者企业员工下载,适合小白学习或者实际项目借鉴参考! 当然也可作为毕业设计、课程设计、课程作业、项目初期立项演示等。如果基础还行,可以在此代码基础之上做改动以实现更多功能。 人脸识别考勤系统 本项目是一个基于 Python人脸识别考勤系统,主要使用了 `dlib`、`opencv`、`tkinter`、`PIL`、`pymysql` 等,并使用了 KNN 算法进行人脸识别。 环境安装 在运行本项目之前,请确保已经安装了以下环境和: - Python - PyCharm - dlib(需要 Cmake、Visual Basic、C++ 依赖环境) - opencv - tkinter - pymysql - PIL - threading - time 功能介绍 本项目具有以下功能: - 打开系统按钮:打开摄像头捕获人脸。 - 注册按钮:将人脸、学号、姓名信息存储到数据中。 - 查看缺勤名单:将没有识别签到的学生学号和姓名导出到打开的名单界面。 - 是否开始训练:点击“是”按钮进行人脸模型的训练。 - 帮助按钮:查看使用软件的注意事项。 注意事项 在使用本项目之前,请注意以下事项: 1. 请先打开系统。 2. 注册时请对准人脸,光线充足。 3. 训练时禁止进行其他操作。 文件说明 本项目包含以下文件: - `recognition.py`:主文件。 - `db.py`:数据文件。 - `help_tip.py`:帮助窗口文件。 - `precamera.py`:预处理文件。 - `late_name.py`:缺勤名单文件。 - `trained_knn_model.clf`:KNN 算法模型文件。 - `knn_examples` 文件夹:包含了训练集和测试集,仅供学习交流探讨使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值