眼前一亮的时刻

我参加开发者大会通常出于两个目的:

第一个目的就是面基,可以认识开发圈的一些新朋友,同时也是和老朋友聚一聚的好机会。现在日常除了带娃,和朋友聚的机会就是各种开发者的活动了。

第二个目的,就是了解一下别人在做些什么。刚从事iOS开发的时候,各个方面都想要了解,而且当别人问到自己不懂的知识点的时候,内心会超级懊恼。年纪大了,慢慢的也就不会在意这些了。开发覆盖的范围太大,每个人精力有限,不可能各个方面都有涉猎。参加开发者大会对我而言便是一个很好的学习机会。对于平时自己工作涉及不到的话题,可以有个粗略的概念;而对于自己感兴趣的课题,可以和讲师讨论,从别人的分享里收获一些启发。

今年3月份参加的try! Swift Tokyo 2019就有一个令我眼前一亮的分享。分享的内容是我喜欢的图像处理。虽说是喜欢,但是自己基本上是零基础。从一个小白的角度写博客,分享自己学习成长的过程,也是我开设这个专栏的目的之一。

备注:之前我在微信朋友圈上说准备挖两个坑。ViewModel系列是一个,这篇文章是另一个。接下来的专栏的文章就是关于这两个系列的,以及今年WWDC发布的新技术的讲解。

言归正传。

这个分享来自神武里奈,叫做Making Portrait mode yourself,自己来实现景深模式。以下是这个分享相关的链接。有些网站还需要大家自行翻墙。

如果你用的iOS设备有背部双摄像头,或者支持FaceID的前摄像头,相信你一定用过系统相机自带的景深模式(portrait mode)。这些摄像头可以记录深度信息,通常被称作depth data或者depth map。Depth map和图片类似,图片的每一个像素点存储着颜色值(比如RGBA)。而depth map的每一个像素点表示对应所拍摄到的物体的点和摄像头的距离。根据这些距离信息,我们可以分离前景(foreground)和背景(background),然后分别对他们进行不同的图像处理。景深模式就是聚焦到前景,对背景进行了模糊处理。

但是,很多我们的照片都不是通过景深模式拍摄的。如果想让这些图片同样具有景深的效果,怎么办好呢?

神武桑给我们展示一个绝妙的方法-使用OpenCV

OpenCV是一个计算机视觉和机器学习的开源库。它包含了超过2500个相关算法,支持所有主流平台。它是C++实现的,所以和Swift混编需要先通过Objective-C来封装。

神武桑通过三步实现了景深效果。

第一步:分离前景和背景

首先我们要分离前景和背景,之后我们给背景添加模糊的效果,就可以模拟出景深模式了。

分离前景和背景,神武桑选用了GrabCut 算法。

首先用矩形圈出全部的前景。矩形外面的部分被标记为背景。

图片来自https://docs.opencv.org/3.4/d8/d83/tutorial_py_grabcut.html

图片来自https://docs.opencv.org/3.4/d8/d83/tutorial_py_grabcut.html

而矩形内部的像素属于未知状态,可能属于前景,也可能是背景。GrabCut算法会根据已标记为前景/背景的像素点,对这些矩形内的像素点进行分类。

如果结果不理想,我们还可以通过手动标记,补充前景和背景信息。

如下图GrabCut算法讲解中的例子,梅西的头发被误分为背景,而草坪被标记为了前景。

图片来自https://docs.opencv.org/3.4/d8/d83/tutorial_py_grabcut.html

图片来自https://docs.opencv.org/3.4/d8/d83/tutorial_py_grabcut.html

top Created with Sketch.