我正在开发一个应用程序,用CameraX和MLKit Facedetecion 来分析相机的实时帧。它在预览用例中工作得很好,但是图像分析用例根本不起作用。
我不明白为什么,因为我正在跟踪最新的官方文件。我的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
previewView = findViewById(R.id.previewView);
if (previewView == null) {
Toast.makeText(this,
"PreviewView not found",
Toast.LENGTH_SHORT).show();
}
iv = findViewById(R.id.face_image_view);
if (iv == null) {
Toast.makeText(this,
"ImageView not found",
Toast.LENGTH_SHORT).show();
}
cameraProviderFuture = ProcessCameraProvider.getInstance(this);
cameraProviderFuture.addListener(() - > {
try {
ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
if (allPermissionsGranted()) {
bindPreview(cameraProvider);
Log.i(TAG, "here1");
} else {
ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSION);
}
} catch (ExecutionException | InterruptedException e) {
// No errors need to be handled for this Future.
// This should never be reached.
}
}, ContextCompat.getMainExecutor(this));
}
void bindPreview(@NonNull ProcessCameraProvider cameraProvider) {
cameraProvider.unbindAll();
//bind preview
Preview preview = new Preview.Builder()
.build();
CameraSelector cameraSelector = new CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_FRONT)
.build();
preview.setSurfaceProvider(previewView.getSurfaceProvider());
//bind image analysis
ImageAnalysis imageAnalysis =
new ImageAnalysis.Builder()
.setTargetResolution(new Size(previewView.getWidth(), previewView.getHeight()))
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build();
imageAnalysis.setAnalyzer(executor, new ImageAnalysis.Analyzer() {
@Override
public void analyze(@NonNull ImageProxy imageProxy) {
int rotationDegrees = imageProxy.getImageInfo().getRotationDegrees();
Log.i(TAG, "here analyzer");
@SuppressLint("UnsafeOptInUsageError") Image mediaImage = imageProxy.getImage();
if (mediaImage != null) {
InputImage image =
InputImage.fromMediaImage(mediaImage, rotationDegrees);
initDrawingUtils(image);
//START configuration of the facedetector
FaceDetectorOptions realTimeOpts =
new FaceDetectorOptions.Builder()
.setContourMode(FaceDetectorOptions.CONTOUR_MODE_ALL)
.build();
FaceDetector detector = FaceDetection.getClient(realTimeOpts);
//END of configuration of face detector
// START detector
detector.process(image)
.addOnSuccessListener(
new OnSuccessListener < List < Face >> () {
@Override
public void onSuccess(List < Face > faces) {
if (!faces.isEmpty()) {
//Get information about detected faces
processFaces(faces);
} else {
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.MULTIPLY);
Log.i(TAG, "vuoto");
}
}
})
.addOnFailureListener(
e - > {
e.printStackTrace();
});
}
}
});
Log.i(TAG, "here4");
//add preview and analysis to the lifecycle
cameraProvider.bindToLifecycle((LifecycleOwner) this, cameraSelector, preview, imageAnalysis);
Log.i(TAG, "here5");
}代码永远不会到达分析器,因此不会处理活动帧。有人能帮帮我吗?
发布于 2021-05-01 13:57:12
不确定这是否是主要问题,但似乎您在处理图像后忘记关闭ImageProxy。尝试将此侦听器添加到从process方法返回的值:
.addOnCompleteListener(task -> imageProxy.close());从文件中:
--如果您使用的是CameraX API,请确保在完成使用它时关闭ImageProxy,例如,向从process方法返回的任务添加一个OnCompleteListener。有关示例,请参阅快速启动示例应用程序中的VisionProcessorBase类.
https://stackoverflow.com/questions/67330946
复制相似问题