我正在使用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()
})
}
我想知道是否有人对如何保留内部有面孔的帧的帧数据有任何想法,以便可以对其进行进一步处理。
谢谢。