如何解决如何在CameraX中获得实时预览并检测用户是否使用Firebase的人脸检测来眨眼?
我正在尝试使用CameraX API和Firebase MLkit人脸检测来检测用户是否眨眼。我对这两个API都是新手,而且我很难使用CameraX,因为大多数教程和文档都是Kotlin(我对Kotlin的知识为零)。我想发生的是我希望CameraX进行实时预览,然后Firebase的人脸检测将确定用户是否眨眼。我遇到的所有CameraX教程都是通过按钮实现的,但我想在闪烁后触发move to dashboard
。下面是我的代码:
public class FaceDetectionActivity extends AppCompatActivity {
private Executor executor = Executors.newSingleThreadExecutor();
private int REQUEST_CODE_PERMISSIONS = 1001;
private final String[] REQUIRED_PERMISSIONS = new String[]{"android.permission.CAMERA","android.permission.WRITE_EXTERNAL_STORAGE"};
private PreviewView mPreviewView;
private FaceDetector detector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_face_detection);
mPreviewView = findViewById(R.id.camera);
if(allPermissionsGranted()){
startCamera(); //start camera if permission has been granted by user
} else{
ActivityCompat.requestPermissions(this,REQUIRED_PERMISSIONS,REQUEST_CODE_PERMISSIONS);
}
FaceDetectorOptions highAccuracyOpts =
new FaceDetectorOptions.Builder()
.setPerformanceMode(FaceDetectorOptions.PERFORMANCE_MODE_ACCURATE)
.setLandmarkMode(FaceDetectorOptions.LANDMARK_MODE_ALL)
.setContourMode(FaceDetectorOptions.CONTOUR_MODE_ALL)
.setClassificationMode(FaceDetectorOptions.CLASSIFICATION_MODE_ALL)
.enableTracking()
.build();
detector = FaceDetection.getClient(highAccuracyOpts);
}
private void startCamera() {
ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);
cameraProviderFuture.addListener(new Runnable() {
@Override
public void run() {
try {
ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
bindPreview(cameraProvider);
} catch (ExecutionException | InterruptedException e) {
// No errors need to be handled for this Future.
// This should never be reached.
}
}
},ContextCompat.getMainExecutor(this));
}
private void bindPreview(@NonNull ProcessCameraProvider cameraProvider) {
Preview preview = new Preview.Builder().build();
CameraSelector cameraSelector = new CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_FRONT)
.build();
ImageAnalysis imageAnalysis = new ImageAnalysis.Builder().build();
ImageCapture.Builder builder = new ImageCapture.Builder();
final ImageCapture imageCapture = builder
.setTargetRotation(this.getWindowManager().getDefaultDisplay().getRotation())
.build();
preview.setSurfaceProvider(mPreviewView.createSurfaceProvider());
cameraProvider.bindToLifecycle(this,cameraSelector,preview,imageAnalysis,imageCapture);
//Detect here first if the user blink
imageCapture.takePicture(executor,new ImageCapture.OnImageCapturedCallback() {
@Override
public void onCaptureSuccess(@NonNull ImageProxy image) {
Bitmap bitmap = getBitmap(image);
InputImage inputImage = InputImage.fromBitmap(bitmap,image.getImageInfo().getRotationDegrees());
Task<List<Face>> result = detector.process(inputImage)
.addOnSuccessListener(faces -> {
for (Face face : faces) {
if (face.getLeftEyeOpenProbability() < 0.4 && face.getRightEyeOpenProbability() < 0.4) {
Log.d("lifeFaceDetection","Blinked");
//Move to dashboard here
} else {
Log.d("lifeFaceDetection","Didn't");
}
}
})
.addOnFailureListener(e -> Log.e("life",e.toString()));
result.addOnCompleteListener(task -> {
if (task.isSuccessful()){
Toast.makeText(FaceDetectionActivity.this,"Image Saved successfully",Toast.LENGTH_SHORT).show();
}
});
super.onCaptureSuccess(image);
}
@Override
public void onError(@NonNull ImageCaptureException exception) {
super.onError(exception);
}
});
}
这也是行不通的,您能告诉我另一种实现闪烁检测的方法吗?
编辑: 我遵循了this教程,但仍然无法将kotlin代码转换为Java。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。