Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android
Code

介绍Android中的人脸检测

by
Difficulty:IntermediateLength:LongLanguages:

Chinese (Simplified) (中文(简体)) translation by chenyi (you can also view the original English article)

人脸检测(Face Detection)库与Play Services 8.1中的Vision库一起引入,它可让开发人员轻松分析视频或图像并定位人脸。 一旦您检测到图像上的脸部列表,您可以收集每个脸部的相关信息,例如方向,微笑,是否有人睁开或闭上眼睛以及他们脸上的特定标记。

该信息可能对多个应用程序有用,例如当框中的每个人都睁开眼睛时自动拍照的相机应用程序,或者用搞笑的效果来增强图像,如独角兽。 重要的是要注意,人脸检测不是人脸识别。 虽然可以收集关于脸部的信息,但是该视觉库不会使用该信息来确定两张脸是否来自同一个人。

本教程将使用静态图像来运行Face Detection API,并收集照片中人员的有关信息,同时还会说明具有重叠图形的信息。 本教程的所有代码都可以在GitHub上找到。

Example of a silly effect adding a unicorn horn to a face

1.  项目设置

要将Vision库添加到项目中,您需要将Play Services 8.1或更高版本导入到项目中。 本教程仅导入Play Services Vision库。 打项目的  build.gradle文件并将以下行添加到 dependencies 节点。

将Play服务添加到项目后,您可以关闭项目的  build.gradle  文件并打开AndroidManifest.xml。 您需要在清单的application节点下添加一个定义面部依赖关系的meta-data项目。 这让Vision Library知道您将在应用程序中检测人脸。

一旦你完成AndroidManifest.xml的设置,你可以关闭它了。 接下来,您需要创建一个名为FaceOverlayView.java的新类。 该类继承View并包含用于检测人脸和显示图像的逻辑,该图像被分析并在图像顶部绘制以便强调点。

现在,首先通过在类的顶部添加成员变量并定义构造函数。 Bitmap对象被用来存储将被分析的位图,Face对象的SparseArray将存储在位图中找到的每张脸。

接下来,在FaceOverlayView中添加一个新方法setBitmap(Bitmap bitmap)。 现在,这将简单地保存传递给它的位图,但是后来您将使用此方法来分析图像。

接下来,您需要一个位图。 我已经在GitHub的示例项目中包含了一个,但是您可以使用任何您想要的图像,以便使用Face Detection进行播放,并查看哪些有效和无效。 选择图像后,将其放入res / raw目录中。 本教程将假定该图像称为face.jpg

将图像放入res / raw目录后,打开res / layout / activity_main.xml。 此布局包含一个FaceOverlayView引用,以便显示MainActivity

有了布局,打开MainActivity并在onCreate()方法中设置FaceOverlayView。 您可以通过获取对视图的引用,从raw目录中读取face.jpg图像文件作为输入流,并将其转换为位图。 一旦拿到位图,你可以调用FaceOverlayViewsetBitmap方法 将图像传递给您的自定义视图。

2.人脸检测

现在项目已建立,是时候开始检测人脸了。 在setBitmap( Bitmap bitmap )中,你需要创建一个FaceDetector。 这可以通过FaceDetector.Builder来完成,允许您定义多个参数,这些参数会影响检测的快速程度以及FaceDetector生成的其他数据。

您选择的设置取决于您在应用程序中尝试执行的操作。 如果您启用搜索脸部标记,检测就会较慢。 与编程中的大多数事情一样,一切都有权衡。 要了解有关FaceDetector.Builder的可用选项的更多信息,您可以在Android开发者网站上找到官方文档。

您还需要检查以确定FaceDetector是否正常运行。 当用户首次在其设备上使用人脸检测时,Play Services需要出门才能获得一组小的本地库来处理您应用程序的请求。 虽然这几乎总是在您的应用程序完成启动之前完成,但重要的是处理这种失败的偶然性。

如果FaceDetector是可操作的,那么您可以将位图转换为Frame对象,并将其传递给检测器,以收集图像中面部的相关数据。 完成后,需要释放检测器以防止内存泄漏。 完成人脸检测后,调用invalidate() 触发器重新绘制视图。

现在您已经检测到图像中的人脸,现在是使用它们的时候了。 在这里,您只需在每张脸上绘制一个绿色框。 由于invalidate()方法是在在检测到面部之后被调用,您可以在onDraw(Canvas canvas)中添加所有必要的逻辑。 该方法确保位图和脸部被设置,然后将位图绘制到画布上,然后在每个面部周围绘制一个框。

由于不同的设备具有不同的显示大小,您还将跟踪位图的缩放大小,使整个图像始终在设备上可见,并且所有叠加层都将被正确绘制。

drawBitmap(Canvas canvas) 方法将您的位图绘制到画布上并适当调整大小,同时还返回一个用于缩放其他尺寸的乘数。

drawFaceBox(Canvas canvas, double scale) 方法更有趣。 检测到并保存的每张脸都有一个位于脸部上方和左侧的位置。 该方法将获得该位置,并从其中绘制一个绿色矩形,以根据其宽度和高度来包围每个面。

您需要定义Paint对象,然后循环SparseArray 中的Face来找到位置,宽度和高度,并使用该信息在画布上画出矩形。

此时,您应该能够运行应用程序,并在已检测到的每个面部周围看到带有矩形的图像。 重要的是要注意,在撰写本文时,Face Detection API仍然是不成熟的,并且可能无法检测每个人的脸部。 您可以修改FaceDetector.Builder对象中的某些设置,以便尽可能收集更多数据。

Faces detected and bound by a drawn rectangle

3.了解标记

标记是一张脸上的感兴趣的点。 人脸检测API不会使用标记来检测脸部,而是在寻找标记之前全面检测脸部。 这就是为什么标记是个可选设置,该设置可以通过FaceDetector.Builder来开启。

您可以使用这些标记作为额外的信息来源,例如主体眼睛的位置,以便您可以在应用程序中进行适当的处理。 有十二个地标记可以找到:

  • 左眼和右眼
  • 左右耳
  • 左右耳尖
  • 鼻子的基础
  • 左右脸颊
  • 嘴角左右角
  • 口的基础

可用的标记取决于检测到的脸部的角度。 例如,面对侧面的人只能看到一只眼睛,这意味着另一只眼睛将无法检测到。 下表列出了基于Euler Y角度(方向左或右)可以检测的标记。

欧拉Y 可见的地标
<-36° 左眼,左口,左耳,鼻底,左脸颊
-36°至-12° 左口,鼻底,底口,右眼,左眼,左脸颊,左耳尖
-12°至12° 右眼,左眼,鼻底,左脸颊,右脸颊,左口,右口,底口
12°至36° 右口,鼻底,底口,左眼,右眼,右脸颊,右耳尖
> 36° 右眼,右口,右耳,鼻底,右脸颊

您的应用程序中的标记也非常易于使用,因为您已经在面部检测中包含了它们。 你只需要调用Face对象的getLandmarks()方法来获得一个可以使用Landmark对象的List 。

在本教程中,你将通过调用一个新的方法,给每个检测到的标记画小圆圈 ,该方法为onDraw(canvas canvas)的 drawFaceLandmarks(Canvas canvas, double scale)方法,而不是  drawFaceBox(Canvas canvas, double scale)。 该方法采用每个标记的位置,对位图的比例进行调整,然后显示标记的指示圆。

调用此方法后,您将看到覆盖到人脸小绿色圆圈,如下面示例所示。

Circles placed over detected facial landmarks

4.其他脸部数据

虽然脸部及其标记的位置很有用,但您还可以通过Face对象中的一些内置方法,找到应用程序中检测到的每个脸部的更多信息。  getIsSmilingProbability(),  getIsLeftEyeOpenProbability()和  getIsRightEyeOpenProbability() 方法尝试确定眼睛是睁开的,或者如果检测到的人脸微笑就返回0.01.0。 越接近1.0,那个人越有可能在微笑,或者左眼或右眼是睁开的。

您还可以通过检查其欧拉值来查找图像的Y轴和Z轴上的脸部角度。 您可以在以下代码段中看到获取这些值的示例。 您可以在以下代码段中看到获取这些值的示例。

结论

在本教程中,您已经了解了Play Services Vision库的一个主要组件,即人脸检测。 你现在知道如何检测静态图像中的面孔了,如何收集信息并为每个面部找出重要的标记。

使用您所学到的知识,您应该能够为自己的应用程序添加一些很好的功能,以增强静态图像,跟踪视频中的面孔,或者其他任何内容。

关注我们的公众号
Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.