超详细注释之OpenCV dlib实现人脸采集

下面是针对“超详细注释之OpenCV dlib实现人脸采集”的完整攻略:

OpenCV dlib实现人脸采集

简介

本文将使用Python中的OpenCV和dlib库来实现人脸采集。dlib库是一个基于机器学习算法的C++工具箱,可以进行人脸检测和面部关键点检测等操作,而OpenCV库则是一个计算机视觉的强大工具,它可以帮助我们实现图像和视频处理。

在这里,我们将使用OpenCV和dlib库中的一些函数和工具来实现人脸检测和面部标记,并将所检测到的面部特征保存到本地文件夹中。

准备工作

在开始实现代码之前,您需要安装以下Python库:

  • numpy
  • dlib
  • opencv-contrib-python

您可以使用以下命令在控制台上安装它们:

pip install numpy dlib opencv-contrib-python

步骤

我们将分成以下步骤实现人脸采集:

  1. 导入必要的库
  2. 加载人脸检测模型
  3. 使用OpenCV捕获视频和图片
  4. 检测面部和保存到本地文件夹

导入必要的库

下面的代码演示了我们如何导入必要的库:

import cv2
import dlib
import numpy as np
import os

其中,cv2dlib分别是OpenCV和dlib库的Python接口,numpy用于矩阵计算,os用于创建文件夹并在其中保存文件。

加载人脸检测模型

在以下代码中,我们使用 dlib 库提供的基于 HOG 特征的人脸检测器来识别面部,并使用下标 0 选择第一个检测器。

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')

这个人脸检测器基于HOG特征,可以很快地检测到面部特征。但是,检测结果可能会有误差,因此在人脸检测器中仍需要一些硬性规则和知识。

使用OpenCV捕获视频和图片

使用OpenCV库的VideoCapture函数来捕获摄像头的视频。 VideoCapture函数接受的参数是摄像头的 ID。在电脑上安装的摄像头通常具有默认ID 0。我们可以使用以下代码来显示摄像头的窗口并捕获视频。

cap = cv2.VideoCapture(0)

同时,我们可以使用imread函数来加载本地图片:

image = cv2.imread("test.jpg")

这里我们读取了本地名称为 test.jpg 的图片。您可以更改为其他路径和文件名。

检测面部和保存到本地文件夹

对于每一帧图像,我们都将使用 dlib 库提供的人脸检测器进行人脸检测和人脸关键点检测。由于OpenCV的图片格式是BGR,因此我们将使用cv2.cvtColor函数来转换为RGB,然后将绘制的面部图形保存到本地文件夹中。以下代码提供了完整的实现。

if __name__ == '__main__':
    os.makedirs('imgs', exist_ok=True)

    while True:
        _, frame = cap.read()

        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        faces = detector(gray)

        for face in faces:
            landmarks = predictor(gray, face)
            landmarks_points = []

            for i in range(68):
                x = landmarks.part(i).x
                y = landmarks.part(i).y
                landmarks_points.append((x, y))

            landmarks_points = np.array(landmarks_points, np.int32)
            convexhull = cv2.convexHull(landmarks_points)
            cv2.drawContours(frame, [convexhull], -1, (0, 255, 0), 3)

            for point in landmarks_points:
                cv2.circle(frame, (point[0], point[1]), 2, (0, 0, 255), -1)

        cv2.imshow("Face collector", frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

        os.makedirs('imgs', exist_ok=True)
        file_name = os.path.join('imgs', 'img_{}.jpg'.format(str(time.time()).replace('.', '')))

        cv2.imwrite(file_name, frame)

    cap.release()
    cv2.destroyAllWindows()

在上述代码中,os.makedirs用于创建存储图像的文件夹。while循环用于持续获取帧并检测面部。在每次循环之后,我们都将在存储图片的文件夹中保存检测到的面部图片。当我们按下键盘上的 "q" 键时,窗口关闭并退出程序。

示例1:捕获摄像头视频并保存检测到的面部

我们可以使用以下代码捕获摄像头视频并保存检测到的面部。

import cv2
import dlib
import os
import numpy as np


def main():
    detector = dlib.get_frontal_face_detector()
    predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')

    cap = cv2.VideoCapture(0)

    os.makedirs('imgs', exist_ok=True)

    while True:
        _, frame = cap.read()

        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        faces = detector(gray)

        for face in faces:
            landmarks = predictor(gray, face)
            landmarks_points = []

            for i in range(68):
                x = landmarks.part(i).x
                y = landmarks.part(i).y
                landmarks_points.append((x, y))

            landmarks_points = np.array(landmarks_points, np.int32)
            convexhull = cv2.convexHull(landmarks_points)
            cv2.drawContours(frame, [convexhull], -1, (0, 255, 0), 3)

            for point in landmarks_points:
                cv2.circle(frame, (point[0], point[1]), 2, (0, 0, 255), -1)

        cv2.imshow("Face collector", frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

        os.makedirs('imgs', exist_ok=True)
        file_name = os.path.join('imgs', 'img_{}.jpg'.format(str(time.time()).replace('.', '')))

        cv2.imwrite(file_name, frame)

    cap.release()
    cv2.destroyAllWindows()


if __name__ == '__main__':
    main()

我们可以调用main()函数开始捕获摄像头视频并保存检测到的面部。

示例2:读取本地图片并保存检测到的面部

我们可以使用以下代码来读取本地图片并保存检测到的面部。

import cv2
import dlib
import numpy as np
import os

def main():
    os.makedirs('imgs', exist_ok=True)

    image = cv2.imread("test.jpg")

    detector = dlib.get_frontal_face_detector()
    predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')

    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    faces = detector(gray)

    for face in faces:
        landmarks = predictor(gray, face)
        landmarks_points = []

        for i in range(68):
            x = landmarks.part(i).x
            y = landmarks.part(i).y
            landmarks_points.append((x, y))

        landmarks_points = np.array(landmarks_points, np.int32)
        convexhull = cv2.convexHull(landmarks_points)
        cv2.drawContours(image, [convexhull], -1, (0, 255, 0), 3)

        for point in landmarks_points:
            cv2.circle(image, (point[0], point[1]), 2, (0, 0, 255), -1)

    cv2.imshow("Face collector", image)
    cv2.waitKey(0)

    os.makedirs('imgs', exist_ok=True)
    file_name = os.path.join('imgs', 'img_{}.jpg'.format(str(time.time()).replace('.', '')))

    cv2.imwrite(file_name, image)

    cv2.destroyAllWindows()


if __name__ == '__main__':
    main()

我们可以调用main()函数来读取本地图片并保存检测到的面部。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:超详细注释之OpenCV dlib实现人脸采集 - Python技术站

(0)
上一篇 2023年6月2日
下一篇 2023年6月2日

相关文章

  • Python新手入门webpy小应用开发

    下面详细讲解一下“Python新手入门webpy小应用开发”的完整攻略。 环境准备 首先,我们需要安装Python环境。在安装完成Python之后,我们可以通过pip安装web.py框架。使用以下命令安装: pip install web.py 基本概念 web.py框架是一个轻量级的Python web框架。它提供了一些基本的工具和功能来帮助我们快速开发w…

    python 2023年5月30日
    00
  • pyttsx3实现中文文字转语音的方法

    下面是“pyttsx3实现中文文字转语音的方法”的完整攻略: 1. 安装pyttsx3 首先,需要安装pyttsx3,可以使用pip安装: pip install pyttsx3 2. 创建Engine实例 接着,创建pyttsx3的Engine实例。Engine是pyttsx3中的核心类,负责把文字转换成语音。可以使用如下代码创建一个Engine实例: i…

    python 2023年5月19日
    00
  • 使用Python 自动生成 Word 文档的教程

    请您耐心阅读以下的教程,此教程分为以下几个部分: 介绍Python生成word文档的工具库 安装工具库 创建word文档 添加文本与表格 添加图片与图表 示例说明 总结 1. 介绍Python生成word文档的工具库 目前Python生态圈里提供了多种文档生成的工具库,常用的有:python-docx,python-docx-template和docxtpl…

    python 2023年5月19日
    00
  • Python中生成一个指定长度的随机字符串实现示例

    生成指定长度的随机字符串,在 Python 中可以使用 random 模块中的 choices 函数。具体实现过程如下: 步骤一:导入 random 模块 import random 步骤二:定义函数 def generate_random_str(length): # 生成可选字符集合,包括大小写字母和数字 char_set = ‘abcdefghijkl…

    python 2023年6月3日
    00
  • Python用matplotlib库画图中文和负号显示为方框的问题解决

    下面为你详细讲解“Python用matplotlib库画图中文和负号显示为方框的问题解决”的完整攻略。 问题描述 在使用Python的matplotlib库进行图形绘制时,有时会发现中文和负号显示为方框的情况。这是因为matplotlib默认的字体不支持中文和负号,需要手动设置支持中文和负号的字体才能解决这个问题。 解决方法 1. 安装支持中文和负号的字体 …

    python 2023年5月18日
    00
  • Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解

    这篇攻略将详细讲解Python协程操作之gevent的用法,包括yield阻塞和greenlet等技术。通过gevent可以实现协程的多任务操作,以及有规律的交替协作执行。下面将从以下几个方面进行介绍: 什么是协程 Python中的协程 gevent的安装和使用 yield阻塞和greenlet技术 协程实现多任务操作的示例 什么是协程 协程是一种用户态的轻…

    python 2023年5月19日
    00
  • 用Python实现web端用户登录和注册功能的教程

    下面我详细讲解一下该攻略。 用Python实现web端用户登录和注册功能的教程 什么是web端用户登录和注册功能 在一个基于web的应用程序中,用户登录和注册是非常常见的功能。用户登录指的是注册用户输入他们的用户名和密码,然后被应用程序验证以进入系统。用户注册是指一个未注册用户输入必要的信息,并在成功验证后创建一个新的帐户。 用到的技术 为了实现用户登录和注…

    python 2023年6月3日
    00
  • 一文解决Python切换版本问题

    一文解决Python切换版本问题 背景 在开发Python应用程序时,我们常常需要切换不同版本的Python环境,以满足不同的开发需求。 但是,每次手动切换Python环境非常麻烦。如果我们想要快速简便地切换Python环境,该怎么办呢? 解决方案 我们可以使用工具 pyenv 来管理Python环境。pyenv 可以方便地安装、切换和管理不同版本的Pyth…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部