0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

搭建了一款GIF动图生成器,其中使用的是OpenCV

zhKF_jqr_AI 来源:未知 作者:李倩 2018-11-10 09:27 次阅读

编者按:今天的介绍的教程轻松有趣,作者Adrian Rosebrock搭建了一款GIF动图生成器,其中使用的是OpenCV,这一过程中会提到以下几点技术:

如何用基于深度学习的方法进行人脸检测

如何用dlib库进行人脸标记检测并提取眼睛部分(因为动图会在眼睛区域添加眼镜)

如何计算旋转角度,让动图眼镜调整到合适位置

最后,如何用OpenCV生成动态GIF

想了解更多细节,就继续读下去吧!

准备工作和依赖环境

OpenCV和dlib

OpenCV是常用的人脸识别和基础图像处理工具,论智君此前也介绍过OpenCV,感兴趣的同学可以阅读:

Node.js遇上OpenCV深度神经网络

用OpenCV实现八种不同的目标跟踪算法

此外,Dlib是用来检测面部标志的工具,可以让我们定位眼睛在脸部的位置,并且让“眼镜”的图标下降到这一位置。dlib的安装教程:www.pyimagesearch.com/2018/01/22/install-dlib-easy-complete-guide/

ImageMagick

ImageMagick是一个跨平台的、基于命令行的工具,能提供多种图片处理功能,例如只用一行指令就能将PNG/JPG图像转换成PDF;多张图片可以集合在一份PDF中;还可以绘制多边形、线条或其他形状。利用ImageMagick,我们还可以用一系列输入图像生成GIF图片。

在Ununtu(或Raspbian)上用apt安装ImageMagick的指令如下:

$ sudo apt-get install imagemagick

如果你用的是macOS,可能会用到HomeBrew:

$ brew install imagemagick

imutils

Imutils是一些列基础图像处理功能,包括转换、旋转、缩放等等。安装指令:

$ pip install imutils

项目架构

我们的项目分为两个目录:

images/:也就是想要对其处理的原始图像。

assets/:这一文件夹包含了我们的人脸探测器、面部标志检测器和所有图像以及相关掩码。利用这些工具,我们会将“墨镜”和“Deal With It”的文字添加到输入图像中。

由于配置参数较多,我决定创建一个JSON配置文件,不仅能在编辑参数时更容易,命令行的参数也更少。在这一任务中我们所需的所有配置参数都包含在config.json中。

用OpenCV生成GIFs

了解JSON配置文件

首先,我们从JSON配置文件开始。打开config.json,插入以下命令:

第2行和第3行是OpenCV深度学习人脸探测器的模型文件,第四行是dlib的面部标志探测器的路径。

接下来我们打开一些图片文件路径:

5—8行是“墨镜”和文字“Deal With It”以及相关掩码的路径,如下所示:

墨镜

墨镜的掩码

文字

文字的掩码

掩码的作用是在照片上覆盖对应的图像。现在我们要对这个GIF生成器设置参数:

min_confidence表示人脸识别结果为正的最低概率。

steps表示生成的GIF所需要的帧数。每一个step我们都会将墨镜从上至下逐帧移动,直到达到目标位置(眼睛)。

delay表示各帧之间的时间延迟。

final_delay表示最后一针的时间延迟。

loop表示GIF是否循环播放。

temp_dir表示临时输出的目录,每一帧都会先存储在这个文件夹中,再创建最终的GIF图像。

开始创建

创建一个新文件夹,将其命名为create_gif.py,插入以下代码,载入imutils、dlib、OpenCV:

接着,定义overlay_image函数:

overlay_image函数是将前景图像(fg)覆盖在背景图像(bg)上,坐标coords通过(x, y)的坐标点表示。

之后,进行alpha合成完成重叠结果:

46—48行中,我们将前景、背景和alpha层转换为[0,1]之间的浮点。接着,我们在51和52行执行alpha合成。最后,添加前景和背景,得出输出,返回函数(37—40行)。

接着创建一个帮助函数,可以用ImageMagick从一系列图片路径中生成一个GIF:

create_gif函数可以处理一系列图片,将它们组合成一张GIF动图,并且还能在帧和帧之间设置一定的延迟或循环。具体来说,在这一函数中我们可以:

提取imagePaths(63行)

提取最后一张图像的路径,因为可能有分离的延迟(66行)

重新分配imagePaths,删除最后一张图片的路径(67行)

组合命令行,开始执行convert创建GIF(72—75行)

创建自己脚本的命令行参数:

下载配置文件和“墨镜”及其掩码:

将OpenCV深度学习人脸检测器载入内存中:

为了下载OpenCV的深度学习人脸检测,我们会调用cv2.dnn.readNetFromCaffe(101和102行)。dnn模块只能在OpenCV3.3及之后的版本中使用。人脸识别器会呈现出如下结果:

在103行,我们下载了dlib的人脸标志预测器,可以定位脸部以及各器官,例如眼睛、眉毛、鼻子、嘴巴、下巴等等:

接着,让我们开始检测脸部:

在这一部分,我们会:

下载输入的照片image(106行)

创建一个blob,输入进人脸检测神经网络(108和109行)

执行人脸检测(113和114行)

确定人脸检测的概率,检查置信区间(119—124行)。如果标准不符合,我们就简单地推出脚本(125行),反之则继续。

提取面部并计算人脸的标记:

得到眼睛的坐标后,我们就能计算将“墨镜”放置在哪里、应该怎样放置:

首先,计算每只眼睛的中心以及二者之间的角度(145—151行)。之后对“墨镜”进行旋转(155行)和尺寸缩放(161和162行)。

之后,还要对掩码进行移动,但是首先,我们需要将掩码转换成灰度并进行二值化运算(170和171行)。之后在进行旋转和缩放(172和173行)。

创建GIF的帧:

动图中,“墨镜”会从上至下落到图片中,所以每一帧都呈现的是墨镜逐渐靠近人脸的过程。利用JSON配置变量steps对墨镜位置进行调整。

最后一步是添加“DEAL WITH IT”的文字,这需要用另一个掩码逐帧操作:

生成结果

现在可以看看我们的表情包生成器结果怎样了,保证你已经下载了源代码(原文地址见文末),打开终端,执行以下命令:

$ python create_gif.py --config config.json --image images/adrian.jpg

--output adrian_out.gif

[INFO] loading models...

[INFO] computing object detections...

[INFO] creating GIF...

[INFO] cleaning up...

可以看到,生成器能在不同角度检测到眼睛的位置,结果比较理想!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 图像处理
    +关注

    关注

    27

    文章

    1292

    浏览量

    56745
  • 生成器
    +关注

    关注

    7

    文章

    315

    浏览量

    21010
  • 深度学习
    +关注

    关注

    73

    文章

    5503

    浏览量

    121158

原文标题:用OpenCV创建GIFs,给你的照片戴上墨镜

文章出处:【微信号:jqr_AI,微信公众号:论智】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    82 Gi Hub上一款宝藏开源项目----美女生成器

    编程语言生成器
    小凡
    发布于 :2022年08月28日 18:34:02

    懒人C51代码生成器

    懒人C51代码生成器一款小软件
    发表于 11-30 00:18

    AllJoyn C++代码生成器

    AllJoyn 团队非常激动地向广大开发商宣布,一款新工具已经问世——代码生成器。如果您拥有定义的 AllJoyn 服务接口规范,即可通过运行此代码生成器,为您的服务端和客户端生成工作
    发表于 09-19 18:11

    为什么我无法从ip core向导生成器生成我的项目中使用的原理

    你好我正在尝试使用内存接口生成器(MIG)来控制开发板sp601的DDR3外部RAM问题是我无法从ip core向导生成器生成我的项目中使用的原理
    发表于 11-07 06:09

    推荐一款:【灵生】单片机代码自动生成器(自动编程工具)

    推荐一款:【灵生】单片机代码自动生成器(自动编程工具)以往编写单片机程序全靠程序员敲代码,门槛高,学习困难,不容易入门,而且编程繁琐,本软件只需要鼠标拖拽模块,再模块间功能连线下,再点生成
    发表于 12-21 16:53

    介绍下ABOV提供的代码生成器

    的开发,下面介绍下ABOV提供的代码生成器,丝毫不输CUBEMX,且ABOV单片机基本都支持keil开发环境。。2. ABOV的代码生成器ABOV代码生成器的风格非常适合国内软件工
    发表于 11-19 08:06

    python生成器

    python生成器1. 什么是生成器生成器(英文名 Generator ),是个可以像迭代器那样使用for循环来获取元素的函数。生成器
    发表于 02-24 15:56

    自制酸奶生成器

    自制酸奶生成器
    发表于 04-23 11:48 935次阅读
    自制酸奶<b class='flag-5'>生成器</b>

    c语言流程生成器下载

    本内容提供了c语言流程生成器下载,欢迎大家下载学习
    发表于 05-10 11:10 178次下载

    C语言流程生成器

    电子发烧友网站提供《C语言流程生成器.rar》资料免费下载
    发表于 07-06 16:54 7次下载

    代码生成器的应用

    jeesite框架代码生成器,可以很方便的生成代码,挺不错的。
    发表于 01-14 15:19 0次下载

    python生成器是什么

    python生成器 1. 什么是生成器生成器(英文名 Generator ),是个可以像迭代器那样使用for循环来获取元素的函数。 生成器
    的头像 发表于 02-24 15:53 3663次阅读

    Arduino赞美生成器

    电子发烧友网站提供《Arduino赞美生成器.zip》资料免费下载
    发表于 11-09 14:22 1次下载
    Arduino赞美<b class='flag-5'>生成器</b>

    通用RFID生成器

    通用RFID生成器资料分享
    发表于 02-10 15:35 1次下载

    Versal GTY/GTYP:使用PRBS生成器和检查器

    本文涵盖了在 Versal GTY 和 GTYP 中使用模式生成器和检查器时对以下操作的限制
    的头像 发表于 07-10 17:18 1099次阅读