移动视觉API的人脸跟踪,而不是检测,可以独立于其CameraSource使用吗?

时间:2018-04-27 15:48:38

标签: android computer-vision android-camera face-detection android-vision

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

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

我正在尝试实现一个功能,可以检测相机视图中的面部,并在这些面上覆盖图像。

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

  1. 一个CameraView(我正在使用     Fotoapparat这里)     可以通过回调传递每个相机框架
  2. 我将该框架转换为Bitmap
  3. 将位图传递给Mobile Vision API以进行面部检测
  4. 当检测到脸部时,我会得到它的位置和大小
  5. 使用该位置信息,在另一个自定义视图上绘制内容。
  6. 问题是,上述过程显然需要花费太多时间。我只能每秒更新覆盖图像位置3-5次,在较慢的设备上更不频繁。

    通过观察剖析,令人惊讶的是,最重的方法是步骤3(面部剔除)。执行一次平均需要100毫秒 第二种方法是将NV21帧转换为Bitmap对象,大约需要90ms 总结一切现在我得到3~5的更新FPS。

    但除此之外,每件事情都很完美 - 图像可以在高质量中捕获,自动对焦捏缩放。< / p>

    面部追踪怎么样?

    另一方面,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()方法,但我找不到任何方法来实施自动对焦和缩放

    最后,问题

    我的最终目标是实现我在开头提到的功能,具有以下要求:

    1. 拍摄高质量图像
    2. 自动对焦
    3. 缩放
    4. 快速的脸部位置 更新(一秒钟大约10次就足够了)
    5. 1-3可以使用人脸检测完成,但不能使用4; 虽然4可以使用Face Tracker完成,但不能使用1-3。

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

      感谢您阅读这么久的问题直到最后!

1 个答案:

答案 0 :(得分:2)

CameraSource.java在宽容on GitHub下可用Apache license。随意添加自动对焦和缩放。