使用ML Kit人脸检测时冻结框架

时间:2019-03-14 19:39:36

标签: java android kotlin android-camera firebase-mlkit

我正在使用ML Kit库,使用CameraView来检测手机相机预览流中的人脸。我实质上是从here复制代码来使用预览流实时检测人脸,然后将其裁剪并覆盖在CameraView的顶部。一切都按预期工作,因此我尝试对其中包含面部的帧进行一些额外的处理(例如,使用API​​进行面部识别,或裁剪面部并将其保存在手机上本地)。但是,CameraView uses one Frame对象不断写入其字节图像数据。这意味着除非相机流中的人脸完全静止,否则当ML Kit检测到人脸并且我尝试处理该帧时,该帧对象的图像数据已更改。因此,我通常会得到一个没有脸的框架,或者下半部分带有一个脸的框架,而上半部分属于下一帧。

我尝试使用frame.freeze()方法,但这导致过多的内存使用,并且即使我使用大堆,我的应用程序每次也会崩溃。下面是我的处理lambda的代码,该代码在后台运行,每当有新帧可用时,CameraView就会调用它。

cameraView.addFrameProcessor((frame ->
  {
     frame = frame.freeze();
     faceDetector.process(new Frame(frame.getData(),
             frame.getRotation(),
             new Size(frame.getSize().getWidth(), frame.getSize().getHeight()),
             frame.getFormat(),
             cameraView.getFacing() == Facing.BACK));
  }));

faceDetector是FaceDetector对象,负责将帧数据传递给ML Kit进行处理。即使我在ML Kit处理完框架后立即调用frame.release(),我仍然会收到OOM异常。以下是功能faceDetector.process()的一部分。

frame.data.let {
        firebaseFaceDetectorWrapper.process(
                image = convertFrameToImage(frame),
                onSuccess = {
                    if (it.isNotEmpty())
                        SaveCroppedPhotoTask(it, frame).execute()
                    faceBoundsOverlay.updateFaces(convertToListOfFaceBounds(it))
                    frame.frame.release()
                },
                onError = {
                    frame.frame.release()
                    Toast.makeText(faceBoundsOverlay.context, "Error processing images: $it", Toast.LENGTH_LONG).show()
                })
    }

我想知道是否有人对如何保留内部有面孔的帧的帧数据有任何想法,以便可以对其进行进一步处理。

谢谢。

0 个答案:

没有答案