问题描述
我正在尝试使用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 (将#修改为@)