android - Mobile Vision API 的人脸跟踪,而不是检测,可以独立于其 CameraSource 使用吗?
问题描述
这个问题是关于在 Android 上使用Google 的 Mobile Vision Face API 。
故事(背景)和我想做的事
我正在尝试实现一个功能来检测相机视图中的面部,并在这些面部上叠加图像。
现在,我已经通过使用 Mobile Vision API 的人脸检测成功实现了这样的功能。它的机制是这样的:
- 可以在回调中传递每个相机帧的 CameraView(我在这里使用 Fotoapparat )
- 我把那个框架变成
Bitmap
- 位图被传递到 Mobile Vision API 以进行人脸检测
- 当检测到人脸时,我得到它的位置和大小
- 使用该位置信息,在另一个自定义视图上绘制一些东西。
问题是,上述过程显然花费了太多时间。我每秒只能更新覆盖图像位置 3-5 次,在速度较慢的设备上更不频繁。
通过查看配置文件,令人惊讶的是,最繁重的方法是第 3 步(人脸检测)。执行一次平均需要 100 毫秒。
第二种重方法是将 NV21 帧转换为 Bitmap 对象,大约需要 90 毫秒。
现在总结一切,我得到 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()
方法,但我找不到任何方法来实现自动对焦和缩放。
最后,问题
我的最终目标是实现我在开头提到的功能,具有以下要求:
- 捕获的高质量图像
- 自动对焦
- 飞涨
- 快速人脸位置更新(一秒钟大约 10 次就足够了)
1-3 可以使用人脸检测完成,但不能使用 4;
虽然 4 可以使用 Face Tracker 完成,但不能使用 1-3。
有没有办法完成所有1-4?我欢迎任何建议,即使是使用另一个库而不是 Mobile Vision。
感谢您阅读这么长的问题直到最后!
解决方案
CameraSource.java 可在 GitHub 上获得许可Apache 许可。随意添加自动对焦和缩放。
推荐阅读
- ios - YouTube Data Api Swift:通过隐私状态和标签将视频分享到 YouTube
- php - 获取非英文字符的单词首字母
- javascript - 从表中的对象数组返回键对值
- json.net - 我删除了 Netwonsoft.json 的所有实例,现在我的 TFS 2017 构建代理失败 - 我该如何取回它?
- acumatica - 扩展 JAMS 制造逻辑会给出消息“尝试通过方法访问 'PX.Data.PXGraphExtension`1
..ctor()' 失败 - node.js - 如何向节点 https 请求添加标头授权
- python - 给定 6 个不同高度的块 h1, h2 。使用 3 个积木为所需高度 h1、h2 的每个塔制作 2 个塔
- android - 适用于 IOS 和 Android 的 Flutter 上的 Firebase db 集成
- sql - 按周排序,2 年 postgresql 之间的数据
- single-sign-on - 使用应用程序网关和 ASE 的 Azure AD 重定向 URL