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

上一篇博客中,我们了解了什么是面部标志,以及如何使用dlib,OpenCV和Python检测它们。利用dlib的HOG SVM的形状预测器获得面部ROI中面部区域的68个点(x,y)坐标。
这一篇博客中,将演示如何使用NumPy数组切片魔术来分别访问每个面部部分并提取眼睛,眉毛,鼻子,嘴巴和下巴的特征。

1. 效果图

先上一张检测完的图:

也可以每一部分先标识出来:

2. 原理

面部标志主要是: 口 右眉 左眉 右眼 左眼 鼻子 下颚线
这一节即提取这些部分;

从图中可以看到假设是以0为下标的数组:

嘴唇可以认为是: points [48, 68]. 内嘴唇:[60,68]
右眉毛 points [17, 22].
左眉毛 points [22, 27].
右眼 [36, 42].
左眼 [42, 48].
鼻子 [27, 35].
下颌 [0, 17].

已经知道下标,数组切片,并用不同的颜色来标识各个部位,imutils包,可以帮助我们更优雅的写代码的包;已经有封装好方法face_utils 。
嘴唇等是闭合区域,用闭合的凸包表示,下颌用线勾勒;

面部标志检测返回结果是:68个(x,y)坐标:
(1)先转为适合OpenCV处理的 Numpy array,
(2)数组切片,用不同的颜色标识不同的面部结构部分;

3. 源码

# 安装了dlib
# imutils 是最新的版本
# python detect_face_parts.py --shape-predictor shape_predictor_68_face_landmarks.dat --image images/girl.jpg

from imutils import face_utils
import numpy as np
import argparse
import imutils
import dlib
import cv2
import shutil
import os

# 构建命令行参数
# --shape-predictor 必须 形状检测器位置
# --image 必须 待检测的图片
ap = argparse.ArgumentParser()
ap.add_argument("-p", "--shape-predictor", required=True,
                help="path to facial landmark predictor")
ap.add_argument("-i", "--image", required=True,
                help="path to input image")
args = vars(ap.parse_args())

temp_dir = "temp"
shutil.rmtree(temp_dir, ignore_errors=True)
os.makedirs(temp_dir)

# 初始化dlib中基于HOG的面部检测器,及形状预测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(args["shape_predictor"])

# 加载待检测的图片,resize,并且装换为灰度图
image = cv2.imread(args["image"])
image = imutils.resize(image, width=500)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 在灰度图中检测面部
rects = detector(gray, 1)

# 循环检测到的面部
num = 0
for (i, rect) in enumerate(rects):
    # 确定面部区域进行面部标志检测,并将其检测到的68个点转换为方便python处理的Numpy array
    shape = predictor(gray, rect)
    shape = face_utils.shape_to_np(shape)

    # 循环遍历面部标志独立的每一部分
    for (name, (i, j)) in face_utils.FACIAL_LANDMARKS_IDXS.items():

        # 复制一张原始图的拷贝,以便于绘制面部区域,及其名称
        clone = image.copy()
        cv2.putText(clone, name, (10, 30), cv2.FONT_HERSHEY_SIMPLEX,
                    0.7, (0, 0, 255), 2)

        # 遍历独立的面部标志的每一部分包含的点,并画在图中
        for (x, y) in shape[i:j]:
            cv2.circle(clone, (x, y), 1, (0, 0, 255), -1)
            # 要实际提取每个面部区域,我们只需要计算与特定区域关联的(x,y)坐标的边界框,并使用NumPy数组切片来提取它:
            (x, y, w, h) = cv2.boundingRect(np.array([shape[i:j]]))
            roi = image[y:y + h, x:x + w]

            # resize ROI区域为 宽度250,以便于更好的可视化
            roi = imutils.resize(roi, width=250, inter=cv2.INTER_CUBIC)

            # 展示独立的面部标志
            cv2.imshow("ROI", roi)
            cv2.imshow("Image", clone)
            cv2.waitKey(0)

        num = num + 1
        p = os.path.sep.join([temp_dir, "{}.jpg".format(
            str(num).zfill(8))])
        print('p: ', p)
        cv2.imwrite(p, output)

    # 应用visualize_facial_landmarks 功能为每个面部部位创建透明的覆盖层。(transparent overlay)
    output = face_utils.visualize_facial_landmarks(image, shape)
    cv2.imshow("Image", output)
    cv2.waitKey(0)

参考

https://www.pyimagesearch.com/2017/04/10/detect-eyes-nose-lips-jaw-dlib-opencv-python/

到此这篇关于超详细注释之OpenCV dlib实现人脸采集的文章就介绍到这了,更多相关OpenCV 人脸采集内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android 中使用 dlib+opencv 实现动态人脸检测功能

    1 概述 完成 Android 相机预览功能以后,在此基础上我使用 dlib 与 opencv 库做了一个关于人脸检测的 demo.该 demo 在相机预览过程中对人脸进行实时检测,并将检测到的人脸用矩形框描绘出来.具体实现原理如下: 采用双层 View,底层的 TextureView 用于预览,程序从 TextureView 中获取预览帧数据,然后调用 dlib 库对帧数据进行处理,最后将检测结果绘制在顶层的 SurfaceView 中. 2 项目配置 由于项目中用到了 dlib 与 open

  • Dlib+OpenCV深度学习人脸识别的方法示例

    前言 人脸识别在LWF(Labeled Faces in the Wild)数据集上人脸识别率现在已经99.7%以上,这个识别率确实非常高了,但是真实的环境中的准确率有多少呢?我没有这方面的数据,但是可以确信的是真实环境中的识别率并没有那么乐观.现在虽然有一些商业应用如员工人脸识别管理系统.海关身份验证系统.甚至是银行人脸识别功能,但是我们可以仔细想想员工人脸识别管理,海关身份证系统的应用场景对身份的验证功能其实并没有商家吹嘘的那么重要,打个比方说员工上班的时候刷脸如果失败了会怎样,是不是重新识

  • Python+Dlib+Opencv实现人脸采集并表情判别功能的代码

    一.dlib以及opencv-python库安装 介于我使用的是jupyter notebook,所以在安装dlib和opencv-python时是在 这个命令行安装的 dlib安装方法: 1.若可以,直接使用上图所示命令行输入以下命令: pip install cmake pip install boost pip install dlib 若安装了visual studio2019应该就可以直接pip install dlib,至少我是这样 由于很多在执行第三句时都会报错,所以这里提供第二种

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

    上一篇博客中,我们了解了什么是面部标志,以及如何使用dlib,OpenCV和Python检测它们.利用dlib的HOG SVM的形状预测器获得面部ROI中面部区域的68个点(x,y)坐标. 这一篇博客中,将演示如何使用NumPy数组切片魔术来分别访问每个面部部分并提取眼睛,眉毛,鼻子,嘴巴和下巴的特征. 1. 效果图 先上一张检测完的图: 也可以每一部分先标识出来: 2. 原理 面部标志主要是: 口 右眉 左眉 右眼 左眼 鼻子 下颚线 这一节即提取这些部分: 从图中可以看到假设是以0为下标的数

  • 超详细注释之OpenCV实现视频实时人脸模糊和人脸马赛克

    目录 1. 效果图 2. 原理 2.1 什么是人脸模糊,如何将其用于人脸匿名化? 2.2 执行人脸模糊/匿名化的步骤 3. 源码 3.1 图像人脸模糊源码 3.2 实时视频流人脸模糊源码 参考 这篇博客将介绍人脸检测,然后使用Python,OpenCV模糊它们来"匿名化"每张图像,以确保隐私得到保护,保证没有人脸可以被识别如何使用. 并介绍俩种模糊的方法:简单高斯模糊.像素模糊. 人脸模糊和匿名化的实际应用包括: 公共/私人区域的隐私和身份保护 在线保护儿童(即在上传的照片中模糊未成年

  • 超详细注释之OpenCV Haar级联检测器进行面部检测

    目录 1. 效果图 2. 原理 2.1 Haar级联是什么? 2.2 Haar级联的问题与局限性 2.3 Haar级联预训练的模型 3. 源码 3.1 图像检测 3.2 实时视频流检测 参考 这篇博客将介绍如何使用预训练好的OpenCV Haar级联人脸.眼睛.嘴部检测器,并将它们应用于图片及实时视频流的检测. 人脸检测结果是最稳定和准确的.不幸的是,在许多情况下,眼睛检测和嘴巴检测结果是不可用的--对于面部特征/部分提取,强烈建议使用python,dlib,OpenCV提取眼睛,鼻子,嘴唇及下

  • 超详细注释之OpenCV更改像素与修改图像通道

    这篇博客将介绍使用Python,OpenCV获取.更改像素,修改图像通道,截取图像感兴趣ROI:单通道图,BGR三通道图,四通道透明图,不透明图: 1. 效果图 原图 VS 更改右下某个像素为红色,更改左上角1/4区域为绿色,效果图如下: 裁剪感兴趣区域:分别截取左上角.右上角.左下角.右下角,各占1/4:效果图如下: 原图 VS 图像单通道灰度图效果如下: 左上原图 VS 右上R通道图 VS 左下G通道图 VS 右下B通道图效果如下: 图像4通道 全透明图 VS 不透明效果图: 2. 源码 #

  • 超详细注释之OpenCV构建透明的叠加层

    为了构造透明的叠加层,需要准备两个图像: (1)原始图片: (2)要 "叠加"在第一个图像上的图像(包含某种级别的Alpha透明度). 透明叠加层的用例几乎无穷无尽,其中俩个是: 可以将运行时的重要信息直接覆盖在输出图像上,而不是在单独的窗口或终端中显示.使用透明的叠加层可以减少混淆输出图像内容的需要! 使用Alpha透明度,将两个图像"融合"在一起. 使用cv2.addWeighted应用透明叠加层功能 cv2.addWeighted(overlay, alpha

  • 超详细注释之OpenCV按位AND OR XOR和NOT

    这篇博客将介绍如何使用OpenCV应用按位AND.OR.XOR和NOT.上一篇学习了如何从图像中裁剪和提取感兴趣的区域(ROI),截取的都是矩形.但是如果想裁剪一个非矩形区域呢?该怎么办? 答案是同时应用位运算和掩蔽. AND:当且仅当两个像素都大于零时,按位AND为真. OR:如果两个像素中的任何一个大于零,则按位或为真. XOR:当且仅当两个像素中的一个大于零,而不是两个都大于零时,按位异或为真. NOT:按位NOT反转图像中的"开"和"关"像素. 比较好记的是

  • 超详细注释之OpenCV制作图像Mask

    这篇博客将介绍如何使用OpenCV制作Mask图像掩码.使用位运算和图像掩码允许我们只关注图像中感兴趣的部分,截取出任意区域的ROIs. 应用: 图像感兴趣区域的截取: 图像融合:构建透明的叠加层: 1. 效果图 原始图如下:(老九门颖宝&佛爷~) 矩形掩码 VS 效果图如下:(使用矩形掩码,只提取图像中包含人物的区域,而忽略其他区域) 圆形掩码 VS 效果图如下:(圆形掩模显示在左边,掩模的应用在右边.实质上可以使用任意形状的掩码图像,如矩形.圆.线.多边形等从图像中提取区域) 2. 源码 #

  • 超详细注释之OpenCV旋转图像任意角度

    上一篇博客介绍了 如何使用Python,OpenCV上下左右(或任意组合)平移图像.这篇博客将介绍如何使用OpenCV旋转图像任意角度.并演示如何使用imutils库中的两个函数imutils.rotate和imutils.rotate_bound不丢失细节的旋转图像. 使用OpenCV应用图像旋转时,有3种方法实现: cv2.getRotationMatrix2D 和 cv2.warpAffine: imutils.rotate 同方法1(可能局部丢失): imutils.rotate_bou

  • 超详细注释之OpenCV操作图像平移转换

    这篇博客将介绍如何使用Python,OpenCV对图像进行平移转换.平移是图像沿x轴和y轴的移动.使用平移,可以将图像上下左右移动,以及上述任意组合.要使用OpenCV平移图像,只需3步: 从磁盘加载图像 定义仿射变换矩阵 应用cv2.warpAffine仿射函数来执行平移 1. 效果图 用了颖宝明兰的新娘图片来演示效果~,喜欢这张图的原因,是这里有一首经典的催妆诗, <催妆诗> 金车欲上怯东风,排云见月醉酒空. 独自仙姿羞半吐,冰瓷露白借微红. 原图如下: 向右向下平移图 VS 向上向左平移

  • Java基础之颜色工具类(超详细注释)

    颜色工具类(超详细注释) 设置属性值自动格式化rgb值和十六进制颜色值. import java.util.HashMap; import java.util.Map; public class Color{ private final String[] hex_letters = {"0", "1", "2", "3", "4", "5", "6", "7

随机推荐