【机器学习】 - 使用dlib进行人脸定位,人脸检测,给人脸图片戴口罩

detector = dlib.get_frontal_face_detector()


功能:人脸检测画框
参数:无
返回值:默认的人脸检测器

faces = detector(img_gray, 0)


功能:对图像画人脸框
参数:img_gray:输入的图片
返回值:人脸检测矩形框4点坐标。坐标为[(x1, y1) (x2, y2)]。可以通过函数的left,right,top,bottom方法分别获取对应的x1, x2, y1, y2值。(cv里的矩阵和C++的那种一样,左上角是(0,0)点,水平为x方向,竖直为y方向,类似笛卡尔系(区别是y轴正方向不同),所以top的y坐标 < bottom的y坐标。matplotlib是相反的。)

后面那个参数代表将原始图像是否进行放大,1表示放大1倍再检查,提高小人脸的检测效果。

                       

左图是参数为0的检测情况,右图是参数为1的检测情况。

上述例子参考自链接:http://blog.sina.com.cn/s/blog_49b3ba190102yvl9.html

 

 

注意dlib只能对灰度图进行检测:

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

注意更改当前文件运行目录 为 程序执行文件路径 的方法:

https://www.jb51.net/article/138980.htm

 

下面进行代码实战:

原图地址

代码实战1:人脸检测

import numpy
import dlib
import cv2
import sys
import os# 修改执行目录为该.py文件所在目录
#dirname, filename = os.path.split(os.path.abspath(sys.argv[0]))
dirname, filename = os.path.split(sys.argv[0])
# print(dirname,filename)
# path = os.getcwd()
os.chdir(dirname)
print(os.getcwd())# 人脸检测
detector = dlib.get_frontal_face_detector()# 人脸关键点标注。
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat'
)
img = cv2.imread('sdtw2.jpg')gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#这样也可以灰度图但是不建议用:im2 = cv2.imread('tfboys.jpg',flags = 0)faces = detector(gray,0)# 第二个参数越大,代表讲原图放大多少倍在进行检测,提高小人脸的检测效果。for face in faces:#左上角(x1,y1),右下角(x2,y2)x1, y1, x2, y2 = face.left(), face.top(), face.right(), face.bottom()print(x1,y1,x2,y2)cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.imshow("image", img)
cv2.waitKey(0)

运行结果:

 

代码实战2:人脸关键点标注


 

import numpy
import dlib
import cv2
import sys
import os#dirname, filename = os.path.split(os.path.abspath(sys.argv[0]))
dirname, filename = os.path.split(sys.argv[0])
# print(dirname,filename)
# path = os.getcwd()
os.chdir(dirname)
print(os.getcwd())# 人脸检测
detector = dlib.get_frontal_face_detector()# 人脸关键点标注。
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat'
)
img = cv2.imread('sdtw2.jpg')gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#这样也可以灰度图但是不建议用:im2 = cv2.imread('tfboys.jpg',flags = 0)dets = detector(gray,0)# 第二个参数越大,代表讲原图放大多少倍在进行检测,提高小人脸的检测效果。for d in dets:# 使用predictor进行人脸关键点检测 shape为返回的结果shape = predictor(gray, d)for index, pt in enumerate(shape.parts()):print('Part {}: {}'.format(index, pt))pt_pos = (pt.x, pt.y)cv2.circle(img, pt_pos, 1, (255, 0, 0), 2)                          #利用cv2.putText标注序号font = cv2.FONT_HERSHEY_SIMPLEXcv2.putText(img, str(index+1),pt_pos,font, 0.3, (0, 0, 255), 1, cv2.LINE_AA)
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

实验结果:

人脸关键点:

附标号:

 

代码实战3:佩戴口罩

我们取2,8,14,28作为口罩关键点,即下图3,9,15,29,放入points_key中

对于待测图片的每一个人脸框,按照对应points_key来检测边界,将口罩图片进行缩放,填入对应区域。

注意对下载后的口罩要进行背景去除,这里可以用一些在线处理网站,或者ps等等。(本项目使用已去除背景的口罩已上传到github)

 

注意实现的时候,有个问题就是透明度的问题,不然会出现下面这个问题:

为了方便讲解,我们将口罩区域分成口罩图像区域,和口罩真实区域。

在代码实现的时候,刚开始只是想着分摊像素值,比如对口罩图像区域,让他80%保留原图像素值,20%来自口罩图像,这样进行merge。但是效果并不是期待的那样。

发现其实口罩部分还是要口罩占主体,所以换成了20%保留原图像素值,80%来自口罩图像,如下图。

剩下的就是透明度的问题了,这里我采用的是二值化方法,把像素值较小的背景部分隐去,像素值较大的是口罩真实区域,采用口罩图80%和人脸图20%进行merge。

阈值设置为80,表现良好。

此项目代码对应代码和实验所用到的图像均放到了github:https://github.com/xuanweiace/put_a_mask_on_the_face/

欢迎下载和star。

 

项目中是用二值化的方法来实验背景透明的功能,cv2中也自带了一个功能可以实现透明化处理,感兴趣的同学可以搜一下:

透明度覆盖:

img_mix = cv2.addWeighted(img1, 1, img2,1, 0) #合并,其中参数1表示透明度,第一个1表示img1不透明,第二个1表示img1不透明,如果改成0.5表示合并的时候已多少透明度覆盖。

 

相关拓展链接:

识别戴口罩的人脸的四种方法:https://blog.csdn.net/qq_23670601/article/details/104344917

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

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

相关文章

Sharepoin学习笔记—架构系列—Sharepoint服务(Services)与服务应用程序框架(Service Application Framework) 1

Sharepoin学习笔记—架构系列—Sharepoint服务(Services)与服务应用程序框架(Service Application Framework) 1 Sharepoint服务是Sharepoint的重要组成&#xff0c;可以说Sharepoint的许多网站功能都是基于这些服务构架起来的。这里把Sharepoint服务的相关要点总结一下。 1、…

【机器学习】 - import cv2 opencv安装python

果然不出我所料&#xff0c;直接pip就出了很多奇奇怪怪的错误&#xff0c;还是用清华镜像吧 输入&#xff1a;pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple 安装完后&#xff0c;重启spyder即可使用。 下载方法2&#xff1a; 下载地址&#xff1a…

Sharepoin学习笔记—架构系列—Sharepoint服务(Services)与服务应用程序框架(Service Application Framework) 2

上一篇我们以问答的方式明确了Sharepoint服务的一些概念&#xff0c;这里我们重点来看两个方面:Sharepoint服务器构架对象模型以及Sharepoint 服务应用程序的某些拓扑结构 一、Sharepoint服务器构架对象模型 二、Sharepoint 服务应用程序的某些拓扑结构 Sharepoint 服务应用程…

【深度学习】 - MobileNet使用的可分离卷积

任何看过MobileNet架构的人都会遇到可分离卷积&#xff08;separable convolutions&#xff09;这个概念。但什么是“可分离卷积”&#xff0c;它与标准的卷积又有什么区别&#xff1f;可分离卷积主要有两种类型&#xff1a; 空间可分离卷积&#xff08;spatial separable con…

SharePoint 2010 WSP包部署过程中究竟发生什么?

在SharePoint 2010中&#xff0c;我们可以使用Visual Studio 2010轻松创建WSP包来安装Web Part&#xff0c; Event Handler&#xff0c; Application Page以及其他。非常方便&#xff0c;但是你有没有研究过在在整个过程中SharePoint究竟做了些什么&#xff1f;以下是我根据htt…

【机器学习】 - 目标检测 - VOC格式数据集介绍与自己制作

一、VOC数据集 PASCAL VOC 挑战赛主要有 Object Classification 、Object Detection、Object Segmentation、Human Layout、Action Classification 这几类子任务。每年都有新的数据集供参赛者进行训练。公布了2007和2012两年的数据集&#xff0c;分别称之为VOC2007和VOC2012&am…

【Python学习】win10+Anaconda3环境,安装phthon第三方库Jieba

一、介绍 jieba库是一款优秀的 Python 第三方中文分词库&#xff0c;jieba 支持三种分词模式&#xff1a;精确模式、全模式和搜索引擎模式&#xff0c;下面是三种模式的特点。 精确模式&#xff1a;试图将语句最精确的切分&#xff0c;不存在冗余数据&#xff0c;适合做文本分…

WebPart开发

Webpart的生命周期 1. 当一个包含WebPart的WSS站点页面被响应请求或者是它被提交到Server端的时候&#xff0c;这时WebPart生存周期开始了 2. OnInit 初始化&#xff0c;加载相关配置文件 (如WebPart任务面板上的属性&#xff0c;样式等配置信息) . 3. Loa…

【PAT甲级最新题解】PAT甲级2020.7月春季考试满分题解(附代码)

写在前面&#xff1a;这次题目虽然大多数是模拟题且不算难&#xff0c;但是题面其实不算友好&#xff0c;不少同学因为题目描述而错失满分。 A&#xff1a; 题意&#xff1a;给定一个数字串&#xff0c;问每一个前缀串是否是素数。 模拟题不多解释。 #include<cstdio>…

如何收缩超大的SharePoint_Config数据库

前言 在已经运行了2年多的SharePoint服务器上&#xff0c;发现SharePoint_Config的数据库文件越来越大&#xff0c;已经达到90几个GB&#xff0c;收缩可以减小20几个GB&#xff0c;但是一周以后又会恢复到90几个GB大小&#xff0c;甚是奇怪。 因为磁盘空间不足&#xff0c;一共…

SharePoint PowerShell命令系列

(1) Backup-SPSite & Restore-SPSite 这两条命令可能是大家最先接触的PowerShell命令了吧, 一个是备份网站集, 另一个是还原网站集. Backup-SPSite 例子 Backup-SPSite http://site_name -Path C:\Backup\site_name.bak 参数 Force: 覆盖现有备份NoSiteLock: 设置备份…

【Processing学习】 - 公交车马路动态绘制

效果图: 汽车动态移动,云彩动态移动,小草没有找到矢量图,百度了一张先用着. float q 0; int s 0; int add 1;PImage p1;void setup() {size(800, 400);background(0, 0, 255);rect(300, 150, 300, 140, 30);//sunfill(255, 255, 0);circle(800, 0, 40);first//circle(360,…

sharepoint 2013 网站集解锁

前言 最近碰到这样的一个问题&#xff0c;就是SharePoint 站点备份&#xff08;Backup-SPSite&#xff09;的时候&#xff0c;速度特别慢&#xff0c;然后网站变成只读状态&#xff08;备份过程中只读属于正常现象&#xff09;。但是&#xff0c;自己手欠把备份命令的PowerShel…

Qt 5.14 安装,windows10系统,64位,详细步骤,非常简单!

下载地址&#xff1a;http://download.qt.io/archive/qt/5.14/5.14.2/ 直接选择windows系统或mac兄或Linux系统对应版本即可。 这里解释一下 Qt 的版本号&#xff0c;比如 5.14.2 是完整的 Qt 库版本号&#xff0c;第一个数字 5 是大版本号&#xff08;major&#xff09;&…

最新的windows xp sp3序列号 xp序列号

最新的windows xp sp3序列号(绝对可通过正版验证) MRX3F-47B9T-2487J-KWKMF-RPWBY(工行版) 可用&#xff08;强推此号) QC986-27D34-6M3TY-JJXP9-TBGMD(台湾交大学生版) 可用 CM3HY-26VYW-6JRYC-X66GX-JVY2D 可用 DP7CM-PD6MC-6BKXT-M8JJ6-RPXGJ 可用 F4297-RCWJP-P482C-YY23Y…

2023年12月16日~12月22日(自适应反馈机制下基于卷积神经网络的高清晰反射波反演算法:CNN-RWI)

标题&#xff1a;Adaptive Feedback Convolutional-Neural-Network-Based High-Resolution Reflection-Waveform Inversion 全波形反演&#xff08;FWI&#xff09;是一种非线性拟合观测地震记录从而获得高清晰速度模型的最优化算法。FWI能够通过拟合浅层初至波和反射波获得较准…

C++语言 如何用G++进行编译和运行程序

在windows下&#xff0c;我们写C程序一般会有如下几个步骤&#xff1a; 编写.cpp文件&#xff0c;代码都在里面&#xff1b;可能还有一些.h文件之类的支持文件&#xff0c;这些文件一般都会放在一起&#xff0c;或者相对位置是固定的&#xff1b;编译文件&#xff0c;链接文件…

SharePoint 2016文档库所在数据库表的说明(文档库数据库)

突然被客户问一个问题&#xff0c;说数据库存在哪一个表&#xff0c;这个原本是开发的事&#xff0c;竟然文档我了&#xff0c;好吧这里记录一下&#xff0c;以便记忆给客户汇报。 SharePoint 数据库表说明&#xff1a; FeaturesTable that holds information about all the …

C++模板类嵌套类内部类局部类的区别

模板类就是将类定义成模板的形式。 C中好像不区分内部类与嵌套类两个名词。 内部类与嵌套类都是指在类中定义类。 局部类是指在函数中定义类。 &#xff08;c不能在函数中定义函数(python可以)。c在类中定义的函数也就是成员函数。&#xff09; &#xff08;c内部类与java内…

为sharepoint 2013 增加切换账户登陆菜单

SharePoint 2010是有一个用户切换功能的&#xff0c;不知为何2013中&#xff0c;将这个优秀的功能取消了&#xff0c;使用如下可以重回辉煌 修改sharepoint 服务器上下面路径中的Welcome.ascx文件&#xff1a; C:\Program Files\Common Files\Microsoft Shared\Web Server Ext…