利用Dlib 实现人脸68个特征点的标定

news2024/11/17 5:36:13

系列文章目录


文章目录

  • 系列文章目录
  • 前言
    • 1. 开发环境依赖
    • 2. 设计流程
      • 68个特征点提取:
      • OpenCv 绘图:
    • 3. 源码
    • OpenCv 的画图函数
      • 1. 画圆
      • 2. 写字符
      • 3.关于 颜色数组:


前言

利用 Dlib 官方训练好的模型 “shape_predictor_68_face_landmarks.dat” 进行 68 个点标定;利用 OpenCv 进行图像化处理,在人脸上画出 68 个特征点,并标明特征点的序号;实现的 68 个特征点标定功能如下图所示:
在这里插入图片描述

1. 开发环境依赖

Python:  3.6.3
Dlib:    19.7
Opencv, NumPy

需要调用的库:

import dlib                     # 人脸检测的库 Dlib
import numpy as np      # 数据处理的库 Numpy
import cv2                      # 图像处理的库 OpenCv

2. 设计流程

两部分:68 个特征点提取 和 OpenCv 绘图

68个特征点提取:

借助 Dlib 官方的 Demo: face_landmark_detection.py,可以得到脸部 68 个特征点的坐标;

OpenCv 绘图:

使用 opencv 中 画圆函数 cv2.circle() 和 画字符函数 cv2.putText() ;

流程:
  1. 调用 Dlib 库来进行人脸识别,调用预测器 “shape_predictor_68_face_landmarks.dat” 进行 68 点标定;
  2. 存入 68 个点坐标;
  3. 利用 cv2.circle 来画 68 个点;
  4. 利用 cv2.putText() 函数来画数字 1-68 ;

3. 源码

# 对静态人脸图像文件进行68个特征点的标定

# Author:   coneypo
# GitHub:   https://github.com/coneypo/Dlib_face_detection_from_camera

import dlib         # 人脸识别的库 Dlib
import numpy as np  # 数据处理的库 numpy
import cv2          # 图像处理的库 OpenCv

# Dlib 检测器和预测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('data/dlib/shape_predictor_68_face_landmarks.dat')

# 读取图像文件
img_rd = cv2.imread("test.jpg")
img_gray = cv2.cvtColor(img_rd, cv2.COLOR_RGB2GRAY)

# 人脸数
faces = detector(img_gray, 0)

# 待会要写的字体
font = cv2.FONT_HERSHEY_SIMPLEX

# 标 68 个点
if len(faces) != 0:
    # 检测到人脸
    for i in range(len(faces)):
        # 取特征点坐标
        landmarks = np.matrix([[p.x, p.y] for p in predictor(img_rd, faces[i]).parts()])
        for idx, point in enumerate(landmarks):
            # 68 点的坐标
            pos = (point[0, 0], point[0, 1])

            # 利用 cv2.circle 给每个特征点画一个圈,共 68 个
            cv2.circle(img_rd, pos, 2, color=(139, 0, 0))
            # 利用 cv2.putText 写数字 1-68
            cv2.putText(img_rd, str(idx + 1), pos, font, 0.2, (187, 255, 255), 1, cv2.LINE_AA)

    cv2.putText(img_rd, "faces: " + str(len(faces)), (20, 50), font, 1, (0, 0, 0), 1, cv2.LINE_AA)
else:
    # 没有检测到人脸
    cv2.putText(img_rd, "no face", (20, 50), font, 1, (0, 0, 0), 1, cv2.LINE_AA)

# 窗口显示
# 参数取 0 可以拖动缩放窗口,为 1 不可以
# cv2.namedWindow("image", 0)
cv2.namedWindow("image", 1)

cv2.imshow("image", img_rd)
cv2.waitKey(0)

OpenCv 的画图函数

1. 画圆

cv2.circle( img, (p1,p2), r, (255,255,255) )

cv2.circle(img=img, center=(50,30), radius=4, color=(255,0,255))

参数 1:  img-     图片对象 img;
  参数 2:  (p1,p2)-   圆心坐标 center;
  参数 3:  r-       半径 radius;
  参数 4:  (255,255,255)-  颜色数组;

2. 写字符

cv2.putText( img,“test”, (p1,p2), font, 4, (255,255,255), 2, cv2, LINE_AA )

cv2.putText(img=img, text=“hello world”, org=(10,30), fontFace=font, fontScale=0.6, color=(187, 255, 255), thickness=1, lineType=cv2.LINE_AA)

参数 1:  img-      图像对象 img;
  参数 2:  “test”-      需要打印的字符 text(数字的话可以利用 str() 转成字符);
  参数 3:  (p1,p2)-     坐标 textOrg;
  参数 4:  font-      字体 fontFace( 注意这里 font = cv2.FONT_HERSHEY_SIMPLEX );
  参数 5:  4-       字号 fontScale;
  参数 6:  (255,255,255)-  颜色数组 color;
  参数 7:  2-        线宽 thickness;
  参数 8:  LINE_AA-    线条种类 line_type;

3.关于 颜色数组:

(255,255,255), (蓝色,绿色,红色),每个值都是 0-255;
比如:蓝色 (255,0,0),紫色 (255,0,255)
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/133984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言 数据结构】树

文章目录树一、树的概念二、树的应用1)树可表示具有分枝结构关系的对象2)树是常用的数据组织形式三、树的表示四、树的基本术语五、树的四种表示方法5.1 双亲表示法5.2 孩子表示法5.3 双亲孩子表示法5.4 孩子兄弟表示法树 一、树的概念 树形结构是一种…

Git基础知识学习

1. Git工作机制 Workspace: 工作区,就是你平时存放项目代码的地方Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息Repository: 仓库区&#xff0…

CleanMyMac4.12.3全新版本Mac清理优化工具

CleanMyMac X是一款超好用的Mac清理优化工具,可以帮助用户删除系统垃圾、不需要的应用程序和恶意软件,并调整您的 Mac 以获得最大速度! CleanMyMac X作为一款知名的系统清理软件,深受广大用户们的喜爱。它操作简洁,能够…

Mycat2(三)mycat2搭建读写分离

文章目录一、mycat一主一从读写分离原理二、搭建MySQL主从复制三、配置mycat2一主一从读写分离四、配置Mycat2双主双从读写分离4.1 Mysql 双主双从搭建步骤1、创建MySQL数据库与MySQL 机器信息2、双柱双从配置2.1 master1配置2.2 master2配置2.3 Slave1、Slave2 配置3、在两台主…

程序员如何在职场上走得更远一些?

一. 工作心态 首先第一个要聊的啊就是这个心态的问题,我觉得有时候可以改变一下自己的心态,可以尝试把工作当成一种投资,或者说呢把工作当成一种自己的产品来经营,把目光多多的聚焦在这个收获和成长上面啊这样一个心态来应对&…

KV数据分片和分布

KV数据分片和分布 KV存储数据组织方式 Hash:对于Hash方式,键值对数据的存储位置由预定义的Hash函数确定,因此所有键值对数据不是有序排列。Hash方式的优点是通过Hash函数计算存储位置的效率高,因此处理插入、删除、更新、单点查…

MySQL之事务

引入事务: 一个事务其实就是一个完整的业务逻辑,它是一个最小的工作单元,是不可再分的。 那么什么是一个完整的业务逻辑呢? 拿现实生活中的银行业务举例,假设转账,从A账户向B账户中转账10000&#xff0c…

Redis:一、简介

Redis 1. redis的简介 1.1 NoSQL的介绍 在介绍redis之前,我们先来了解一下NoSQL(Not only SQL),不仅仅是SQL。 NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系型数据库在应付web2.0网站,特别…

Cache(缓存)基本概念

cache的概念在计算机中被广泛应用,包括TLB等都使用了它的理念,因此对其进行总结。Cache——位于CPU上,处于寄存器和内存之间的存储单元。 Cache Hit & Miss在写入cache的时候,有hit(命中)和miss&#x…

基于ros1的 apollo 7.0.0规划控制算法

apollo.ros-7.0.0 上次给大家带来了之前学习apollo时开发的内容apollo.ros-1.0.0和apollo.ros-3.0.0,主要是针对apollo 1.0.0和3.0.0版本进行了ros1下的移植和规划控制算法的学习。本次在之前工作的基础上,针对apollo 7.0.0版本,进行了ros1下…

植物大战僵尸:分析植物的攻击速度

植物大战僵尸中,植物是有攻击速度的,比如每隔一段时间会吐出一些子弹,那么由此可判断吐出子弹应该是由一个计数器控制的,也就是说只要我们能够找到控制植物攻击的时钟并改写它,也就可以实现植物的无限吐子弹。 吐出子…

数据结构---二叉树

坚持看完,结尾有思维导图总结 这里写目录标题什么是二叉树?二叉树的定义二叉树的性质二叉树的基石在哪里?总结什么是二叉树? 二叉树的定义 二叉树,就是从一个根开始,按照两边分支的方式向下生长的树,就能…

python虚拟环境的概念,用法(pycharm)

1.在PyCharm中创建python项目时,需要配置python的运行环境,除了使用系统现有环境以外,还可以创建虚拟环境。 2.虚拟环境的创建是因为在实际开发中需要同期用到不同版本的python解释器,不同的第三方库以及同一个第三方库的不同版本…

Qt音视频开发08-ffmpeg内核优化(极速打开/超时回调/实时响应)

一、前言 最初编写这套视频解析组件的时候,面对的场景是视频监控行业,对应设备都是网络监控摄像机,传过来的都是rtsp这种视频流,做过这一块的人都知道,打开某个视频流默认耗时比较大,基本上在2s左右&#…

高级前端二面手写面试题(边面边更)

解析 URL Params 为对象 let url http://www.domain.com/?useranonymous&id123&id456&city%E5%8C%97%E4%BA%AC&enabled; parseParam(url) /* 结果 { user: anonymous,id: [ 123, 456 ], // 重复出现的 key 要组装成数组,能被转成数字的就转成数字…

四【Servlet基础】文件配置及环境搭建(重要)

文章目录4.1 Servlet概念4.2 Servlet作用4.3 Servlet开发步骤4.3.1 搭建开发环境4.3.2 创建项目4.3.3 部署Servlet4.3.4 配置Servlet4.3.5 测试运行4.1 Servlet概念 (1)Servlet:Server Applet的简称,是运行在Web服务器端的Java程…

GDB无法debug的错误

GDB无法debug的错误 一、输出错误信息描述 Warning: opening /proc/PID/mem file for lwp 707.707 failed: No such file or directory (2) Warning: Cannot insert breakpoint 1. Cannot access memory at address 0x806950 二、解决方法 方法:修改 GDB 的二进…

spring之IoC注解(三)负责注入的注解

文章目录前言一、Value注解Product类spring配置文件测试程序运行结果二、Autowired与Qualifier注解1.创建OrderDao接口2.创建OrderDao接口实现类3.创建OrderService类4.配置文件5.测试程序6.运行结果三、Resource注解(重要)1、创建StudentDao接口2、创建…

皮带断裂识别检测系统 opencv

皮带断裂识别检测系统通过opencv深度学习yolo计算机视觉识别技术对皮带运行状态进行全天候实时监测,当识别到皮带断裂撕裂时立即抓拍告警存档。OpenCV-Python是一个Python绑定库,旨在解决计算机视觉问题。OpenCV-Python使用Numpy,这是一个高度…

LeetCode刷题复盘笔记—一文搞懂动态规划之392. 判断子序列问题(动态规划系列第三十八篇)

今日主要总结一下动态规划的一道题目,392. 判断子序列 题目:392. 判断子序列 Leetcode题目地址 题目描述: 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除&a…