安卓人脸检测 - Vision API 或 Camera API

7

我需要一种简单的方法在我的相机应用中检测人脸。我只关心回调功能,告诉我在某个特定位置或者坐标上检测到了人脸。我注意到似乎有几个人脸检测API - 在Google Play服务中以及遗留API和Camera2 API中。针对上述简单需求,我应该使用哪一个API?

1个回答

7
遗留版本较旧,精度比新的Google Play服务API低得多。
camera2 API依赖于内置于相机硬件中的人脸检测功能,因此并不一定适用于所有设备。我没有进行详尽的比较,但我认为准确性也低于新的Google Play服务API。
请参阅此教程,了解如何在相机预览中使用Google Play服务API跟踪人脸:

https://developers.google.com/vision/face-tracker-tutorial

你需要定义的回调函数将是Tracker的子类,类似于教程中的GraphicFaceTracker。
如果你不需要跟踪人脸或者有其他管理相机的代码,你可以直接调用人脸检测器,如下所示:
Frame frame = Frame.Builder().setBitmap(myBitmap).build();
SparseArray<Face> faces = faceDetector.detect(frame);

请在此处查看相关信息:

https://developers.google.com/android/reference/com/google/android/gms/vision/package-summary


谢谢。我看了Play和遗留API,使用Play的API并不是很直接,特别是当你有自己的相机控制器类而不使用CameraSource时。我尝试为我的代码实现与开源CameraSource相同的逻辑,但似乎存在一个错误。几个小时后,我还是使用了遗留API。 - vkislicins
我在上面添加了更多关于如何直接调用人脸检测器的信息。您是否发现API中有什么特别不直观的地方? - pm0733464
我遇到的问题是,在我的相机控制器中使用与CameraSource(https://github.com/googlesamples/android-vision/blob/master/visionSamples/barcode-reader/app/src/main/java/com/google/android/gms/samples/vision/barcodereader/ui/camera/CameraSource.java)相同的逻辑。有一个用于保持帧并从中检索的映射,但始终返回null(源代码中第1124行)。这与示例代码中提出的问题有关:https://github.com/googlesamples/android-vision/issues/60 - vkislicins
我建议尝试我在github上提出的解决方法。对于这种情况,我认为这是由于在重新启动相机源时前几帧接收到旧图像缓冲区的临时效果。对于你的情况,我猜想可能是同样的问题,可能是地图没有被填充,或者可能是缓冲区从未被注册到相机。 - pm0733464
谢谢,我会重新审视它。我的印象是这个解决方法只是为了防止空指针崩溃,但数据始终为空,因此代码停留在while循环中,不会泄漏到空指针的区域,然而没有收集到任何数据,因此也无法传递给检测器。通过调试,我可以看到地图被填充了,但get没有找到相同的帧...我会再看一下。 - vkislicins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接