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

yizhihongxing

下面是针对“超详细注释之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日

相关文章

  • 新版selenium4.0 + Python使用详解

    新版selenium4.0 + Python使用详解 Selenium是一个自动化测试工具,可以用于模拟用户在浏览器中的交互行为。Selenium支持多种编程语言,其中Python是最受欢迎的语言之一。本文将详细讲解如何使用Python编写Selenium测试用例,包括环境配置和示例代码。 环境配置 要使用Python编写Selenium测试用例,需要安装P…

    python 2023年6月3日
    00
  • 使用python把Excel中的数据在页面中可视化

    下面是使用Python将Excel数据可视化的完整实例教程,包含两个示例说明。 简介 在Python中,我们可以使用pandas和matplotlib库将Excel数据转化为图表,并在网页中展示。具体来说,我们需要使用以下步骤: 加载Excel文件,并将其转化为pandas数据框 对数据框进行数据分析、数据预处理等操作 使用matplotlib库进行可视化,…

    python 2023年5月13日
    00
  • python 判断文件还是文件夹的简单实例

    下面是完整攻略: 判断文件和文件夹的简单实例 在Python中,使用os模块可以方便地判断一个路径是文件还是文件夹。常用的函数有os.path.isfile()和os.path.isdir()。 isfile()函数 判断一个路径是否为文件,可以使用os.path.isfile()函数。示例代码如下: import os # 判断文件是否存在 file_pa…

    python 2023年6月2日
    00
  • Python lambda if 语句 re.sub

    【问题标题】:Python lambda if statement re.subPython lambda if 语句 re.sub 【发布时间】:2023-04-07 00:54:01 【问题描述】: 所以我使用以下正则表达式来解析文本并从特定字典中获取信息: re.sub(r'(<Q\d+>)’,lambda m: quotes[m.grou…

    Python开发 2023年4月7日
    00
  • 利用python在大量数据文件下删除某一行的例子

    当我们需要处理非常多的数据文件时,我们可能需要通过编程方式来对数据进行处理。下面是使用Python语言处理大量数据文件中删除某一行的例子攻略。 1. 准备工作 首先,我们如果要操作大量的文件,需要准备好数据文件所在的文件夹。例如,我们将所有需要处理的数据文件都放在一个名为”data”的文件夹下。 然后,我们需要安装Python中的两个库:os和glob。 o…

    python 2023年6月6日
    00
  • 从零学python系列之数据处理编程实例(二)

    让我来为您介绍一下“从零学python系列之数据处理编程实例(二)”的完整攻略。 本篇教程旨在通过编写数据处理程序,帮助初学者进一步掌握Python语言中的基础知识和编程技巧。该篇教程的主题是:数据清洗,包含以下内容: 数据清洗的概念 筛选数据 清除缺失值 替换值 重命名列 数据类型转换 接下来,我们将对每个内容进行详细的讲解。 数据清洗的概念 数据清洗是指…

    python 2023年5月14日
    00
  • Python趣味挑战之给幼儿园弟弟生成1000道算术题

    我来为你详细讲解Python趣味挑战之给幼儿园弟弟生成1000道算术题的完整攻略。 1. 确定需求与实现方法 首先,我们需要明确题目的需求,即生成1000道随机的加减法算术题,并将其输出到文件中。根据这个需求,我们可以利用Python的random库来生成随机数,并用循环语句生成1000道算术题,再将其写入文件。 2. 生成随机数 为了生成随机数,我们需要借…

    python 2023年6月5日
    00
  • Python中的字符串操作和编码Unicode详解

    Python中的字符串操作和编码Unicode详解 Python中的字符串是不可变的序列,由多个Unicode字符组成。Python提供了一系列字符串相关的内置函数和运算符,方便进行各种字符串操作以满足需求。同时,Unicode编码在Python中得到了广泛的应用,Unicode编码支持对几乎所有语言的字符集进行编码和解码,因此理解并掌握Unicode编码也…

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