Mobile Vision API 的面部跟踪(而非检测)能否独立于其 CameraSource 使用?

Can Mobile Vision API's Face Tracking, not Detection, used independent of its CameraSource?

这个问题是关于在 Android 上使用 Google's Mobile Vision Face API

故事(背景)和我想做的事

我正在尝试实现一个功能,该功能可以检测相机视图中的人脸,并在这些人脸上叠加图像。

现在,我已经使用Mobile Vision API的Face Detection成功实现了这样的功能。它的机制是这样的:

  1. 一个CameraView(我正在使用 Fotoapparat 这里)那个 可以在回调中传递每个相机帧
  2. 我把那个框架变成 Bitmap
  3. 位图传递给Mobile VisionAPI进行人脸检测
  4. 当检测到人脸时,我得到它的位置和大小
  5. 使用该位置信息,在另一个自定义视图上绘制一些东西。

问题是,上面的过程显然花费了太多时间。我每秒只能更新叠加图像位置 3-5 次,在较慢的设备上更新频率更低。

从profiling来看,最重的方法竟然是第3步(人脸检测)。执行一次平均需要100ms。
第二重的方法是将NV21帧转换为Bitmap对象,大约需要90ms。
现在总结所有内容,我得到 3~5 的更新 FPS。

但除此之外,一切都很完美 - 图像可以 高质量自动对焦双指缩放.

人脸追踪怎么样?

另一方面,Mobile Vision API 提供另一个 API - Face Tracking.

在Google的示例应用程序中,跟踪速度非常快,它几乎是瞬间跟随相机预览中的人脸。如文档中所述,这是因为机制完全不同——不是在每一帧上检测人脸,一旦检测到人脸,位置只是跟随其移动而不执行任何人脸检测。

但事实上这种机制在我的用例中已经足够好了!

但是,通过查看示例代码,我似乎必须使用其内置的 CameraSource 实现。这可以在下面的代码中找到:

    mCameraSource = new CameraSource.Builder(context, detector)
            .setRequestedPreviewSize(640, 480)
            .setFacing(CameraSource.CAMERA_FACING_BACK)
            .setRequestedFps(30.0f)
            .build();

detector是这里的主角,只有传给CameraSource的时候才会用到这里。 看来还是得坚持用这个CameraSource.

然而,虽然这个相机源有takePicture()方法,但我找不到任何方法来实现自动对焦和缩放

最后,问题

我的最终objective是实现我在开头提到的功能,满足以下要求:

  1. 捕获的高质量图像
  2. 自动对焦
  3. 缩放
  4. 快速面部位置 更新(一秒10次左右就够了)

1-3可以用人脸检测,4不行;
虽然 4 可以使用 Face Tracker 完成,但 1-3 不行。

有办法完成1-4吗?我欢迎任何建议,即使是使用另一个库而不是 Mobile Vision。

感谢您把这么长的问题看完!

CameraSource.java 可用 on GitHub under a permissive Apache license。随意添加自动对焦和缩放。