超详细注释之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实现LRU算法

    下面是关于“Python实现LRU算法”的完整攻略。 1. 什么是LRU算法 LRU(Least Recently Used)算法是一种常用的缓存淘汰算法,它的基本思是将最近最少使用的缓存块淘汰掉,以便为新的缓存块腾出空间。在Python中,我们可以使用字典双向链表来实现LRU算法。 2. Python实现LRU算法 下面是使用Python实现LRU算法的整…

    python 2023年5月13日
    00
  • 如何在Python中使用SQLObject ORM操作数据库?

    SQLObject是一个Python ORM(对象关系映射)库,它提供了一种简单的方式来操作关系型数据库。使用SQLObject,我们可以使用Python代码来创建、读取、更新删除关系数据库中的数据。以下是如何在Python中使用SQLObject ORM操作的完整使用攻略,包括连接数据库、创建表、插入数据、查询数据等步骤。同时,提供了两个示例以便更好理解如…

    python 2023年5月12日
    00
  • Python常用库推荐

    Python 常用库推荐 Python 是一种非常流行的编程语言,因其拥有丰富、跨平台、易用等特点,成为数据科学、人工智能、Web开发等领域的首选语言。Python社区也非常活跃,涌现出了许多优秀的库,以下是一些常用的Python库推荐。 数据科学 NumPy NumPy是Python数学计算中必不可少的库,它提供了高级的数学函数和数组(NDarray)操作…

    python 2023年5月14日
    00
  • Python读取文件的四种方式的实例详解

    为了讲解该攻略,我将按照以下步骤进行说明: 简述Python读取文件的四种方式有哪些 说明每一种方式的语法和使用方法 给出至少两个实例进行演示 Python读取文件的四种方式 Python读取文件的四种方式如下: 使用read()函数读取整个文件 逐行读取文件内容 使用with语句自动关闭文件 使用pandas库读取CSV文件 下面分别进行详细说明。 使用r…

    python 2023年6月5日
    00
  • Python实现生命游戏的示例代码(tkinter版)

    Python生命游戏是一种基于细胞自动机的游戏,它由John Horton Conway于1970年发明,在计算机和数学领域内有着广泛的应用。本文主要讲解如何使用Python和tkinter库实现生命游戏,其中包含完整的代码实现和步骤说明。 实现步骤 1. 创建窗口和画布 首先,我们需要使用tkinter库创建一个显示窗口和一个画布,代码示例如下: impo…

    python 2023年6月3日
    00
  • 教你用python编写脚本实现自动签到

    教你用Python编写脚本实现自动签到 简介 本文将详细讲解如何使用Python编写脚本实现自动签到。在本文中,我们将使用Selenium和ChromeDriver两个库。Selenium是一个自动化测试工具,可以用于模拟用户在Web上的操作,如点击按钮等。而ChromeDriver则是Selenium用于控制Chrome浏览器的驱动程序。 环境配置 首先,…

    python 2023年5月19日
    00
  • python 使用sys.stdin和fileinput读入标准输入的方法

    首先,我们需要了解什么是标准输入。标准输入是指程序的默认输入,通常是从键盘输入数据。在Python中,我们可以使用sys.stdin和fileinput模块来读入标准输入数据。 使用sys.stdin读入标准输入 sys.stdin是Python标准库中的一个文件对象,可以用来读取标准输入。使用sys.stdin读取标准输入的方法如下: import sys…

    python 2023年6月2日
    00
  • 更改 Python 脚本的 DNS 服务器

    【问题标题】:Changing DNS server for Python script更改 Python 脚本的 DNS 服务器 【发布时间】:2023-04-05 11:42:01 【问题描述】: 我正在编写一个脚本,该脚本将在我大学的服务器上运行。该脚本的目的是检查网站并记录其 HTTP 状态代码和 IP 地址。这通常可以正常工作,但我遇到了一个我很难…

    Python开发 2023年4月5日
    00
合作推广
合作推广
分享本页
返回顶部