用OpenCV创建GIFs,给你的照片戴上墨镜

Posted 论智

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用OpenCV创建GIFs,给你的照片戴上墨镜相关的知识,希望对你有一定的参考价值。

来源:pyimagesearch
编译:Bing

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

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

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

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

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

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

准备工作和依赖环境


OpenCV和dlib

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的指令如下:

 
   
   
 
  1. $ sudo apt-get install imagemagick

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

 
   
   
 
  1. $ brew install imagemagick

imutils

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

 
   
   
 
  1. $ pip install imutils


项目架构

用OpenCV创建GIFs,给你的照片戴上墨镜

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

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

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

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

用OpenCV生成GIFs

了解JSON配置文件

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

用OpenCV创建GIFs,给你的照片戴上墨镜

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

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

用OpenCV创建GIFs,给你的照片戴上墨镜

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

用OpenCV创建GIFs,给你的照片戴上墨镜

墨镜


用OpenCV创建GIFs,给你的照片戴上墨镜

墨镜的掩码


用OpenCV创建GIFs,给你的照片戴上墨镜

文字


用OpenCV创建GIFs,给你的照片戴上墨镜

文字的掩码

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

用OpenCV创建GIFs,给你的照片戴上墨镜

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

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

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

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

  • loop表示GIF是否循环播放。

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

开始创建

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

用OpenCV创建GIFs,给你的照片戴上墨镜

接着,定义overlay_image函数:

用OpenCV创建GIFs,给你的照片戴上墨镜

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

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

用OpenCV创建GIFs,给你的照片戴上墨镜

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

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

用OpenCV创建GIFs,给你的照片戴上墨镜

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

  • 提取imagePaths(63行)

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

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

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

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

用OpenCV创建GIFs,给你的照片戴上墨镜

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

用OpenCV创建GIFs,给你的照片戴上墨镜

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

用OpenCV创建GIFs,给你的照片戴上墨镜

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

用OpenCV创建GIFs,给你的照片戴上墨镜

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

用OpenCV创建GIFs,给你的照片戴上墨镜

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

用OpenCV创建GIFs,给你的照片戴上墨镜

在这一部分,我们会:

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

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

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

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

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

用OpenCV创建GIFs,给你的照片戴上墨镜

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

用OpenCV创建GIFs,给你的照片戴上墨镜

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

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

创建GIF的帧:

用OpenCV创建GIFs,给你的照片戴上墨镜

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

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

用OpenCV创建GIFs,给你的照片戴上墨镜

生成结果

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

  2.    --output adrian_out.gif

  3. [INFO] loading models...

  4. [INFO] computing object detections...

  5. [INFO] creating GIF...

  6. [INFO] cleaning up...

用OpenCV创建GIFs,给你的照片戴上墨镜

用OpenCV创建GIFs,给你的照片戴上墨镜

用OpenCV创建GIFs,给你的照片戴上墨镜

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

用OpenCV创建GIFs,给你的照片戴上墨镜

星标论智,每天获取最新资讯

以上是关于用OpenCV创建GIFs,给你的照片戴上墨镜的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV-用图像处理作出素描图(给你的另一半试试吧)

OpenCV-Python实战(番外篇)——利用增强现实制作美颜挂件,让你的照片与众不同

仅一张人脸就能被扒得底裤不剩:口罩墨镜都没用,跨平台跨时空,这个人脸搜索惹了众怒...

无所遁形——快把你的口罩戴上(口罩识别)

基于HSV颜色空间用OpenCV-Python给照片换底

Azure进阶攻略 | 你的程序也能察言观色?这个真的可以有!