能否脱离CameraSource独立使用Mobile Vision API的人脸追踪(非检测)功能?
当然没问题!Google Mobile Vision的人脸追踪功能本来就设计成可以脱离官方的CameraSource独立使用——毕竟你已经在用Fotoapparat的CameraView获取帧数据了,这其实已经踩对了核心的路子。
下面是具体的实现思路和步骤:
核心逻辑说明
人脸检测API本身只需要图像数据输入(比如Bitmap、NV21字节流等),完全不绑定特定的相机采集框架。你只需要把从Fotoapparat拿到的每一帧画面,转换成API能识别的Frame对象,就能直接调用检测/追踪能力。
具体实现步骤
1. 初始化独立的人脸检测器
首先创建一个配置好的FaceDetector实例,不需要依赖CameraSource,直接手动初始化即可:
// 构建配置:开启追踪是实现人脸连续追踪的关键 FaceDetector faceDetector = new FaceDetector.Builder(context) .setTrackingEnabled(true) // 启用追踪,同一人脸在连续帧中会有稳定的ID .setLandmarkType(FaceDetector.ALL_LANDMARKS) // 可选:检测人脸关键点(眼睛、鼻子等) .setMode(FaceDetector.FAST_MODE) // 根据需求选模式:FAST/ACCURATE .build(); // 检查检测器是否可用(比如模型是否已下载) if (!faceDetector.isOperational()) { // 可以提示用户等待模型下载,或者引导到Google Play服务设置 Log.w("FaceDetect", "人脸检测模型未准备好,请稍候"); }
2. 转换Fotoapparat的帧数据为Frame对象
你已经能从Fotoapparat拿到每一帧的Bitmap,直接用它构建Frame即可:
// 假设从Fotoapparat的回调中拿到了帧Bitmap Bitmap frameBitmap = ...; // 你的帧数据 // 构建API需要的Frame对象 Frame frame = new Frame.Builder() .setBitmap(frameBitmap) .setRotation(getCameraRotation()) // 可选:设置相机旋转角度,确保坐标正确 .build();
如果追求更高性能,也可以直接用Fotoapparat提供的NV21格式字节流(相机原生格式,比Bitmap更高效)构建Frame:
byte[] nv21Data = ...; // 从Fotoapparat拿到的NV21字节流 int previewWidth = ...; // 相机预览宽度 int previewHeight = ...; // 相机预览高度 int rotation = getCameraRotation(); // 相机旋转角度 Frame frame = new Frame.Builder() .setImageData(nv21Data, previewWidth, previewHeight, ImageFormat.NV21) .setRotation(rotation) .build();
3. 执行人脸追踪并处理结果
把Frame传入检测器,就能拿到包含追踪ID的人脸列表,同一人脸在连续帧中getId()会保持不变:
SparseArray<Face> detectedFaces = faceDetector.detect(frame); for (int i = 0; i < detectedFaces.size(); i++) { Face face = detectedFaces.valueAt(i); // face.getId() 是该人脸的唯一追踪ID,连续帧中同一人ID不变 float faceLeft = face.getPosition().x; float faceTop = face.getPosition().y; float faceWidth = face.getWidth(); float faceHeight = face.getHeight(); // 这里就可以用这些坐标在相机画面上叠加你的图片了 drawOverlayOnFace(faceLeft, faceTop, faceWidth, faceHeight); }
4. 关键注意事项
- 记得在合适的时机释放检测器:在Activity/Fragment销毁时调用
faceDetector.release(),避免内存泄漏。 - 相机旋转角度一定要和
Frame的setRotation()对应,否则人脸坐标会出现偏移。你可以从Fotoapparat获取相机的实际旋转角度,或者根据屏幕方向计算。 - 尽量复用
FaceDetector实例,不要每帧都新建,避免性能损耗。
内容的提问来源于stack exchange,提问作者Sira Lam
相关产品推荐
相关产品推荐

