opencv yuv保存本地_OpenCV-dlib-python3实现人脸戴墨镜和含Y的抖音效果

1 说明:

=====

1.1 吸烟有害健康!!纯属娱乐和学习python的相关知识。

1.2 虽然是娱乐,但是opencv、dlib和python在人工智能、人脸识别、自动化等有很大作用,目前已经或者未来会有更多的应用,作为一名普通人,学习一点知识很有必要。

1.3 我的文章通俗易懂,小白都会,而且亲测过,没有编程经验的,一看就会!可以培养自己和孩子的学习计算机和编程兴趣!

1.4 效果图:

fef298983ce7caaede090d9161e6a4dc.png

图片来源:https://www.wanyx.com/jiaocheng/36683.html

2 准备工作:

========

2.1 环境:

华为笔记本电脑、深度deepin-linux操作系统、python3.8和微软vscode编辑器。

2.2 要求:

2.2.1 PIL、numpy、imutils模块安装,安装简单,省略。

2.2.2 cv2模块安装:

pip install opencv-python#下面是我的cv2模块相关初步介绍的文章https://www.toutiao.com/i6833713845005976067/

2.2.3 dlib模块安装:有坑!!!

我是这么安装的,从github下载包,解压。

https://github.com/davisking/dlib

我是在桌面上,终端打开,输入:

python setup.py install  #推荐#下面是我的安装#xgj@xgj-PC:~/Desktop/dlib/dlib-master$ sudo python3.8 setup.py install  #本机安装
8a9f800cd5adea8e3831a611f97e2309.png

3 代码来源:

========

3.1 源代码:

https://github.com/tomoncle/face-detection-induction-course

下载,解压,找到:input_video_stream_paste_mask.py,进行修改。

3.2 shape_predictor_68_face_landmarks.dat下载

官网,网速慢,还有坑,建议下面地址下载。

https://jaist.dl.sourceforge.net/project/dclib/dlib/v18.10/shape_predictor_68_face_landmarks.dat.bz2

3.3 修改后的代码:为了简洁,删除不必要的注释和代码:

# @Author  : tomoncle# @Site    : https://github.com/tomoncle/face-detection-induction-course#导出模块from time import sleepimport cv2import numpy as npfrom PIL import Imagefrom imutils import face_utils, resizefrom dlib import get_frontal_face_detector, shape_predictorclass DynamicStreamMaskService(object): #动态黏贴面具服务    def __init__(self, saved=False):        self.saved = saved  # 是否保存图片        self.listener = True  # 启动参数        self.video_capture = cv2.VideoCapture(0)  # 调用本地摄像头        self.doing = False  # 是否进行面部面具        self.speed = 0.1  # 面具移动速度        self.detector = get_frontal_face_detector()  # 面部识别器        #下载的shape_predictor_68_face_landmarks.dat,解压放在指定路径下,因为我是启动微软vscode编辑器        self.predictor = shape_predictor("/home/xgj/Desktop/dlib/xxx/face-detection-induction-course-master/shape_predictor_68_face_landmarks.dat")  # 面部分析器        self.fps = 4  # 面具存在时间基础时间        self.animation_time = 0  # 动画周期初始值        self.duration = self.fps * 4  # 动画周期最大值        self.fixed_time = 4  # 画图之后,停留时间        self.max_width = 500  # 图像大小        self.deal, self.text, self.cigarette = None, None, None  # 面具对象    def read_data(self):        _, data = self.video_capture.read()        return data    def save_data(self, draw_img):        if not self.saved:            return        #指定路径        draw_img.save("/home/xgj/Desktop/dlib/xxx/face-detection-induction-course-master/images/%05d.png" % self.animation_time)    def init_mask(self):        self.console("加载面具...")        self.deal, self.text, self.cigarette = (            #修改指定路径,因为我是启动微软vscode编辑器            Image.open(x) for x in ["/home/xgj/Desktop/dlib/xxx/face-detection-induction-course-master/images/deals.png", "/home/xgj/Desktop/dlib/xxx/face-detection-induction-course-master/images/text.png", "/home/xgj/Desktop/dlib/xxx/face-detection-induction-course-master/images/cigarette.png"]        )    def get_glasses_info(self, face_shape, face_width):        left_eye = face_shape[36:42]        right_eye = face_shape[42:48]        left_eye_center = left_eye.mean(axis=0).astype("int")        right_eye_center = right_eye.mean(axis=0).astype("int")        y = left_eye_center[1] - right_eye_center[1]        x = left_eye_center[0] - right_eye_center[0]        eye_angle = np.rad2deg(np.arctan2(y, x))        deal = self.deal.resize(            (face_width, int(face_width * self.deal.size[1] / self.deal.size[0])),            resample=Image.LANCZOS)        deal = deal.rotate(eye_angle, expand=True)        deal = deal.transpose(Image.FLIP_TOP_BOTTOM)        left_eye_x = left_eye[0, 0] - face_width // 4        left_eye_y = left_eye[0, 1] - face_width // 6        return {"image": deal, "pos": (left_eye_x, left_eye_y)}    def get_cigarette_info(self, face_shape, face_width):        mouth = face_shape[49:68]        mouth_center = mouth.mean(axis=0).astype("int")        cigarette = self.cigarette.resize(            (face_width, int(face_width * self.cigarette.size[1] / self.cigarette.size[0])),            resample=Image.LANCZOS)        x = mouth[0, 0] - face_width + int(16 * face_width / self.cigarette.size[0])        y = mouth_center[1]        return {"image": cigarette, "pos": (x, y)}    def orientation(self, rects, img_gray):  #人脸定位        faces = []        for rect in rects:            face = {}            face_shades_width = rect.right() - rect.left()            predictor_shape = self.predictor(img_gray, rect)            face_shape = face_utils.shape_to_np(predictor_shape)            face['cigarette'] = self.get_cigarette_info(face_shape, face_shades_width)            face['glasses'] = self.get_glasses_info(face_shape, face_shades_width)            faces.append(face)        return faces    def start(self):        self.console("程序启动成功.")        self.init_mask()        while self.listener:            frame = self.read_data()            frame = resize(frame, width=self.max_width)            img_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)            rects = self.detector(img_gray, 0)            faces = self.orientation(rects, img_gray)            draw_img = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))            if self.doing:                self.drawing(draw_img, faces)                self.animation_time += self.speed                self.save_data(draw_img)                if self.animation_time > self.duration:                    self.doing = False                    self.animation_time = 0                else:                    frame = cv2.cvtColor(np.asarray(draw_img), cv2.COLOR_RGB2BGR)            cv2.imshow("hello mask", frame)            self.listener_keys()    def listener_keys(self):        key = cv2.waitKey(1) & 0xFF        #按字母q是退出        if key == ord("q"):            self.listener = False            self.console("程序退出")            sleep(1)            self.exit()        #按字母d是开始戴墨镜和叼烟        if key == ord("d"):            self.doing = not self.doing    def exit(self):        self.video_capture.release()        cv2.destroyAllWindows()    def drawing(self, draw_img, faces):        for face in faces:            if self.animation_time < self.duration - self.fixed_time:                current_x = int(face["glasses"]["pos"][0])                current_y = int(face["glasses"]["pos"][1] * self.animation_time / (self.duration - self.fixed_time))                draw_img.paste(face["glasses"]["image"], (current_x, current_y), face["glasses"]["image"])                cigarette_x = int(face["cigarette"]["pos"][0])                cigarette_y = int(face["cigarette"]["pos"][1] * self.animation_time / (self.duration - self.fixed_time))                draw_img.paste(face["cigarette"]["image"], (cigarette_x, cigarette_y),                               face["cigarette"]["image"])            else:                draw_img.paste(face["glasses"]["image"], face["glasses"]["pos"], face["glasses"]["image"])                draw_img.paste(face["cigarette"]["image"], face["cigarette"]["pos"], face["cigarette"]["image"])                draw_img.paste(self.text, (75, draw_img.height // 2 + 128), self.text)    @classmethod    def console(cls, s):        print("{} !".format(s))if __name__ == '__main__':    ms = DynamicStreamMaskService()    ms.start()

3.4 效果:

a488aa49b9524e06a7ef08f1dcb8603e.png

吸烟有害健康!!!哈哈哈

4 小插曲:

=======

4.1 本机是华为笔记本电脑,预装深度deepin-linux操作系统,原因众所周知!使用起来还是很方便的!

4.2 在我调用摄像头时,起初竟然一片漆黑!!于是,我私下“骂了华为”,什么“高科技”笔记本电脑,竟然没有安装摄像头!!!

4.3 后来网上一查,还真是高科技,华为牛!摄像头藏在键盘7上面,如下图,按一下弹出来,牛!

c529d75d076e3a44df165f03aee29bc1.png

华为威武!中华有为,支持国产!!

自己整理并分享出来,喜欢的点赞、转发和收藏。

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

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

相关文章

为什么永远不会有语言取代 C/C++?

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络数以百计的 C/C 替代品将会出现&#xff0c;但 C/C 将永远与我们同在&#xff01;每个 CPU 都带有一种称为 ISA&#xff08;指…

qt 表格中插入一行_在EXCEL表格中,快速插入多行、多列的技巧

在使用Excel过程中&#xff0c;我们会遇到需要插入相同格式的多行或多列&#xff0c;如果一行行或一列列的插入&#xff0c;对于插入的数量较少的情况还是适用的。可是如果需要插入上百的行或列&#xff0c;使用此方法就比较费时费力啦。分享几个小技巧实现快速插入多行或多列.…

amber 口译_口译员设计模式示例

amber 口译本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff…

别再自己瞎写工具类了,SpringBoot内置工具类应有尽有,建议收藏!!

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络断言断言是一个逻辑判断&#xff0c;用于检查不应该发生的情况Assert 关键字在 JDK1.4 中引入&#xff0c;可通过 JVM 参数-en…

ad转换器工作原理_AD转换中参考电压的作用

AD转换AD转换就是模数转换。顾名思义&#xff0c;就是把模拟信号转换成数字信号。主要包括积分型、逐次逼近型、并行比较型/串并行型、Σ-Δ调制型、电容阵列逐次比较型及压频变换型。A/D转换器是用来通过一定的电路将模拟量转变为数字量。模拟量可以是电压、电流等电信号&…

面试大全 | C语言高级部分总结

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络一、内存大话题1.0、内存就是程序的立足之地&#xff0c;体现内存重要性。1.1、内存理解&#xff1a;内存物理看是有很多个Ban…

ideal pom文件安装到maven库中_java学习之web基础(14)Maven基础学习

maven介绍Maven 是一个项目管理工具&#xff0c;它包含了一个项目对象模型 (POM&#xff1a; Project Object Model)&#xff0c;一组标准集合&#xff0c;一个项目生命周期(Project Lifecycle)&#xff0c;一个依赖管理系统(Dependency Management System)&#xff0c;和用来运…

戴尔集群监控与管理系统_监控与管理

戴尔集群监控与管理系统本文是我们名为“ EAI的Spring集成 ”的学院课程的一部分。 在本课程中&#xff0c;向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来&#xff0c;您将深入研究Spring Integration的基础知识&#xff0c;例如通道&#xff0…

三位数除以两位数竖式计算没有余数_苏教四上期末复习——两、三位数除以两位数...

期末复习读万卷书 &#xff1c;做一好题第二单元两、三位数除以两位数计算能力1、竖式计算5106740961700262914246829810132、简便方法计算150253810(92)560353、填空720秒( )分300分( )时336时( )日调商1、小李计算一道除法是两位数的除法算式&#xff0c;商是12&#x…

单例模式示例_单例设计模式示例

单例模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

解读C++即将迎来的重大更新(一):C++20的四大新特性

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络C20&#xff08;C 编程语言标准 2020 版&#xff09;将是 C 语言一次非常重大的更新&#xff0c;将为这门语言引入大量新特性。…

小尼机器人_小尼被机器人嫌弃“唱歌难听,长相一般”?

我们如今所处的时代&#xff0c;科技创新的速度日新月异,生活方式多彩多姿。人人都说&#xff1a;科技改变了生活。今晚《开门大吉》也迎来了三大改变生活的神奇黑科技&#xff01;智能且生态的“移动城堡”在网上预定好酒店以后&#xff0c;到了现场没有前台和服务员&#xff…

产品原型示例_原型设计模式示例

产品原型示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

13 年,MySQL 之父赌赢了:另起炉灶的 MariaDB 成功上市!

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络&#xff0c;侵权删&#xff01;今年 2 月&#xff0c;开源数据库厂商 MariaDB 完成了 1.04 亿美元的 D 轮融资&#xff0c;同…

太阳粒子是什么东西_太阳光子前世今生告诉我们现在享受之阳光是十几万年前诞生的老光...

我们都知道天晴时阳光明媚&#xff0c;但这个阳光是怎么来的呢&#xff0c;很多人就不一定清楚了。在这里我们首先来了解几个概念&#xff1a;光子、光、电磁波、电磁辐射。光子是传递电磁波相互作用的基本粒子&#xff0c;是一种规范波色子&#xff0c;是电磁辐射的载体&#…

java 观察者模式示例_观察者设计模式示例

java 观察者模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 …

int类型存小数 mysql_MySQL基本数据类型

1&#xff09;整形1.介绍分类&#xff1a;tinyint , smallint , mediumint , int , bigint 应用场景&#xff1a;存储年龄&#xff0c;等级&#xff0c;id&#xff0c;各种号码等典型存储范围介绍:https://images2017.cnblogs.com/blog/1036857/201708/1036857-201708011814337…

枚举重名_举重设计模式示例

枚举重名本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01…

装饰着模式示例_装饰器设计模式示例

装饰着模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &…

强烈推荐!10个超赞的C语言开源项目

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络今天给大家分享10个超赞的C语言开源项目&#xff0c;希望这些内容能对大家有所帮助&#xff01;01WebbenchWebbench是一个在 L…