《深度学习》Dlib、OpenCV 轮廓绘制

目录

一、Dlib轮廓绘制

1、什么是轮廓绘制

2、步骤

        1)导入所需的库和模型

        2)加载人脸检测器

        3)读取图像

        4)人脸检测

        5)关键点定位

        6)绘制轮廓线条

        7)展示结果

二、案例实现

1、完整代码

        运行结果:

2、实时摄像头或视频检测

        运行结果:


一、Dlib轮廓绘制

1、什么是轮廓绘制

        在Dlib中,人脸识别的轮廓绘制是指通过检测人脸的关键点位置,使用直线或曲线连接这些关键点,从而绘制出人脸的轮廓线条。这些关键点通常包括眉毛、眼睛、鼻子、嘴巴等部位的位置。通过绘制人脸轮廓,可以对人脸进行更精确的分析和识别。

2、步骤

        1)导入所需的库和模型

                使用Dlib库进行人脸识别,需要导入相应的库和模型文件。

        2)加载人脸检测器

                使用Dlib提供的人脸检测器模型,加载并初始化人脸检测器。

        3)读取图像

                将待处理的图像读取到内存中。

        4)人脸检测

                使用人脸检测器对图像进行人脸检测,获取人脸的位置信息。

        5)关键点定位

                使用Dlib提供的关键点检测器模型,对检测到的人脸进行关键点定位,即确定人脸的眼睛、鼻子、嘴巴等部位的位置。

        6)绘制轮廓线条

                通过将关键点的位置连接起来,使用直线或曲线绘制出人脸的轮廓线条。

        7)展示结果

                将绘制好的轮廓线条展示在图像上,并可将结果保存或显示出来。

二、案例实现

1、完整代码

import numpy as np
import dlib
import cv2def drawLine(start,end):  # 将指定的点连接起来pts = shape[start:end]   # 索引遍历出来关键点的坐标for l in range(1,len(pts)):ptA = tuple(pts[l-1])   # 遍历第一个点开始ptB = tuple(pts[l])     # 遍历上一个点的后一个点cv2.line(image, ptA, ptB,(0,255,0),2)  # 将两个点连接起来def drawConvexHull(start,end):# 将指定的点构成一个凸包,绘制成轮廓,一般眼睛、嘴使用凸包用来绘制Facial = shape[start:end + 1]   # 索引的方式获取关键点的坐标mouthHull = cv2.convexHull(Facial)  # 凸包函数,用于计算二维点集的凸包,凸包是覆盖所有点的最小凸多边形,返回凸包的点集,或者叫二维顶点cv2.drawContours(image,[mouthHull], -1,(0, 255, 0),  2)  # 绘制检测到的凸包轮廓,-1表示绘制所有轮廓image = cv2.imread("people2.png")   # 读取图片
detector = dlib.get_frontal_face_detector()  # 构造脸部位置检测器
faces = detector(image,0)  # 检测人脸。返回检测到的人脸
# 读取人脸关键点定位模型
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
for face in faces:  # 遍历检测到人脸shape = predictor(image,face)  # 调用关键点检测器,获取人脸的关键点# 将关键点转换为坐标(x,y)的形式shape = np.array([[p.x,p.y] for p in shape.parts()])  # 获取每个人脸的关键点坐标drawConvexHull(36,41)   # 绘制右眼凸包,因为眼睛的关键点索引为36-41,凸包是覆盖所有点的最小凸多边形drawConvexHull(48, 59)  # 绘制左眼凸包drawConvexHull(48,59)   # 绘制嘴外部凸包drawConvexHull(60, 67)   # 绘制嘴内部凸包drawLine(0,17)   # 绘制脸颊点线,将脸上的点都连接起来drawLine(17, 22)drawLine(22, 27)drawLine(27, 36)
cv2.imshow("Frame",image)
cv2.waitKey()
cv2.destroyAllWindows()
        运行结果:

2、实时摄像头或视频检测

def drawLine(start,end):#将指定的点连接起水pts = shape[start:end]  #获取点集for l in range(1,len(pts)):ptA = tuple(pts[l-1])ptB = tuple(pts[l])cv2.line(image, ptA, ptB,(0,255,0),2)def drawConvexHull(start,end):# 将指定的点构成一个凸包,绘制成轮廓,一般眼睛、嘴使用凸包用来绘制Facial = shape[start:end + 1]mouthHull = cv2.convexHull(Facial)  # 凸包函数cv2.drawContours(image,[mouthHull], -1,(0, 255, 0),  2)cap = cv2.VideoCapture("笑容.mp4")
if not cap.isOpened():   # 如果打开失败print("Cannot open camera")exit()  # 终止程序detector = dlib.get_frontal_face_detector()  # 构造脸部位置检测器
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")while True:ret, image = cap.read()faces = detector(image,0)  # 检测人险方位置# 读取入脸关键点定位模型for face in faces:# 对检测到的rects,还个遍历shape = predictor(image,face)# 获取关键点# 将关键点转换为坐标(x,y)的形式shape = np.array([[p.x,p.y] for p in shape.parts()])drawConvexHull(36,41)   # 绘制右眼凸包drawConvexHull(48, 59)  # 绘制左眼凸包drawConvexHull(48,59)   # 绘制嘴外部凸包drawConvexHull(60, 67)   # 绘制嘴内部凸包drawLine(0,17)   # 绘制脸颊点线drawLine(17, 22)drawLine(22, 27)drawLine(27, 36)cv2.imshow("Frame",image)k = cv2.waitKey(20)  # 每一帧画面执行20毫秒if k == 27:  # 如果键盘点击esc键,终止循环break
cv2.destroyAllWindows()
        运行结果:

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

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

相关文章

《Spring Cloud 微服务:构建高效、灵活的分布式系统》

《Spring Cloud 微服务:构建高效、灵活的分布式系统》 一、引言 在当今快速发展的数字化时代,软件系统的规模和复杂性不断增加。为了应对这种挑战,微服务架构应运而生。Spring Cloud 作为构建微服务架构的强大工具集,提供了一系…

【华为】静态NAT、动态NAT、NAPT、Easy IP、NAT Server

静态 NAT:将内网主机的私网 IP地址一对一映射到公网 IP 地址。动态 NAT:将内网主机的私有地址转换为公网地址池里面的地址。由于静态NAT严格地一对一进行地址映射,这就导致即便内网主机长时间离线或者不发送数据时,与之对应的公有…

Mac 电脑安装redis

1、首先检查电脑是否安装 brew 命令: #打开Mac自带的终端,输入下面命令 brew --version如下图,可以看到我的 brew 正常的,且对应版本是4.0.17-63-g32f2258 如果你的电脑执行上面命名报错:zsh: command not found: br…

一个很恶心但发顶会很牛的方向!【小样本学习+目标检测】

【小样本学习目标检测】致力于通过有限的标注样本实现高效的目标检测,以应对数据匮乏的挑战。这一领域的研究对于缩小人工智能与人类学习系统之间的差异、增强模型对新类别的适应能力、推动智能识别系统在实际场景中的应用具有重要意义。 为了帮助研究人员深入理解…

【可答疑】基于51单片机的智能衣柜(含仿真、代码、报告、演示视频等)

✨哈喽大家好,这里是每天一杯冰美式oh,985电子本硕,大厂嵌入式在职0.3年,业余时间做做单片机小项目,有需要也可以提供就业指导(免费)~ 🐱‍🐉这是51单片机毕业设计100篇…

多进程编辑

使用父子进程完成两个文件的拷贝&#xff0c;父进程拷贝前一半&#xff0c;子进程拷贝后一半&#xff0c;两个进程同时进行 #include <myhead.h> int main(int argc, const char *argv[]) {//用于保存pid号pid_t pid -1;//创建子进程pid fork();//打印一下进程号print…

在vue中v-show不起作用

在vue中v-show不起作用 1、应用场景描述 表单分步骤提交&#xff0c;需要保存用户所填写过的信息&#xff0c;在点击上一步的时候&#xff0c;回显所填信息&#xff0c;所以不可以使用v-if来进行步骤切换&#xff0c;要使用v-show&#xff0c;但是当使用v-show的时候出现了另…

SpringBoot接收LocalDateTime参数

一、通过RequestBody接收 方式1&#xff1a;实体类上加上 JsonFormat&#xff0c;并通过 pattern 属性指定时间格式 public class Time {JsonFormat(pattern "yyyy-MM-dd HH:mm:ss")LocalDateTime localDateTime;JsonFormat(pattern "yyyy-MM-dd")Loca…

C语言 | Leetcode C语言题解之第491题非递减子序列

题目&#xff1a; 题解&#xff1a; int** ans; int ansSize; int* temp; int tempSize;void dfs(int cur, int last, int* nums, int numsSize, int** returnColumnSizes) {if (cur numsSize) {if (tempSize > 2) {ans[ansSize] malloc(sizeof(int) * tempSize);memcpy(…

985研一学习日记 - 2024.10.16

一个人内耗&#xff0c;说明他活在过去&#xff1b;一个人焦虑&#xff0c;说明他活在未来。只有当一个人平静时&#xff0c;他才活在现在。 日常 1、起床6:00√ 2、健身1个多小时 今天练了二头和背部&#xff0c;明天练胸和三头 3、LeetCode刷了3题 旋转图像&#xff1a…

oracle归档日志爆满问题处理

最近客户单位的oracle数据库出了问题&#xff0c;经常出现无法连接,报错提示 ORA-00257: archiver error, Connect internal only, until freed.&#xff0c;手动清除归档日志后可以恢复访问&#xff0c;但是过不了几天依旧会爆满&#xff0c;每日生成的归档日志很大。经过详细…

(K)MP有限状态自动机

模式匹配自动机 什么是有限状态自动机&#xff1f; 定义 n 个不同状态&#xff0c;记为 {1,2…n}&#xff0c;在状态 i 时输入 s&#xff0c;达到状态 j&#xff0c;记为 goto (i,s)j 对于字符串 s 而言&#xff0c;在一个状态 i 下输入一个字符 ch&#xff0c;也会达到一个指…

ssh连接慢的问题或zookeeper远程连接服务超时

问题原因&#xff1a; 在SSH登录过程中&#xff0c;服务器会通过反向DNS查找客户端的主机名&#xff0c;然后与登录的IP地址进行匹配&#xff0c;以验证登录的合法性。如果客户端的IP没有域名或DNS服务器响应缓慢&#xff0c;这可能导致SSH登录过慢。为了解决这个问题&#xf…

尤雨溪都打赏的虚拟列表组件,到底有多强

尤雨溪都打赏的虚拟列表组件&#xff0c;到底有多强&#xff1f; 在前端开发中&#xff0c;性能优化永远是绕不开的主题。今天就带你看看 vue-virtual-scroller&#xff0c;一款让你滚动页面时流畅得像火箭一样的 Vue 组件。本文将简单介绍这个组件的主要功能、技术特点&#x…

理解和检测横向运动

希望对组织发起勒索软件攻击的威胁行为者能够使用被盗的凭据进入用户的电子邮件帐户。利用鱼叉式网络钓鱼技术和侦察&#xff0c;威胁行为者向 IT 部门发送电子邮件&#xff0c;要求提供重要网络应用程序的凭据。他们获得凭据&#xff0c;深入网络&#xff0c;并开始发起勒索软…

JavaWeb合集07-MyBatis

七、MyBatis MyBatis是一款优秀的持久层&#xff08;dao&#xff09;框架&#xff0c;用于简化JDBC的开发。 MyBatis本是Apache的一个开源项目iBatis, 2010年这个项目由apache迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。 官网&#xff1a;https://mybati…

Axure重要元件三——中继器查询和统计

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 本节课&#xff1a;中继器查询页数 课程内容&#xff1a;查询中继器页面、自动统计页数、自动统计数据条数、上一页下一页 应用场景&#xff1a;表单的查询、表单的基本…

10秒钟用Midjourney画出国风味的变形金刚

上魔咒 Optimus Prime comes from the movie Transformers, Chinese style, Wu ShanMing, Ink Painting Halo Dyeing, Conceptual of the Digita Art, MasterComposition, Romantic Ancient Style, Inspired by traditional patterns and symbols, Minimalism, do not con…

【数据分享】全国资源和环境-环境污染治理投资(1998-2021年)

数据介绍 一级标题指标名称单位指标解释资源和环境环境污染治理投资总额亿元环境污染治理投资指在污染源治理和城市环境基础设施建设的资金投入中&#xff0c;用于形成固定资产的资金&#xff0c;其中污染源治理投资包括工业污染源治理投资和“三同时”项目环保投资两部分。环…

ssm基于SSM的社区管理系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 [2 系统…