【发布时间】:2020-06-23 18:59:33
【问题描述】:
我一直在开发一个应用程序,它需要使用 CameraX 进行预览流,但它还需要一种用于解码文本的框式覆盖。我已经成功实现了预览,但似乎无法找到一种方法来实现一个覆盖,在不使用任何第三方应用程序的情况下,文本将被解码。现在我们可以解码整个屏幕的文本。我在 Codelabs 教程 (link) 中看到了一个代码,但它在 Kotlin 中,我无法破译这个复杂的 Kotlin 代码。如果有人可以在不使用第三方库的情况下帮助我做到这一点,那就太好了。提前致谢。
我的 XML 代码:
<androidx.camera.view.PreviewView
android:id="@+id/previewView"
android:layout_width="match_parent"
android:layout_height="675dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/toolbar">
我的相机逻辑:
PreviewView mCameraView;
Camera camera;
void startCamera() {
mCameraView = findViewById(R.id.previewView);
cameraProviderFuture = ProcessCameraProvider.getInstance(this);
cameraProviderFuture.addListener(() -> {
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));
}
void bindPreview(@NonNull ProcessCameraProvider cameraProvider) {
Preview preview = new Preview.Builder().
setTargetResolution(BestSize())
.build();
CameraSelector cameraSelector = new CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build();
preview.setSurfaceProvider(mCameraView.createSurfaceProvider());
ImageAnalysis imageAnalysis = new ImageAnalysis.Builder()
.setTargetResolution(new Size(4000, 5000))
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build();
imageAnalysis.setAnalyzer(executor, image -> {
frames++;
int rotationDegrees = degreesToFirebaseRotation(image.getImageInfo().getRotationDegrees());
Image mediaImage = image.getImage();
if (mediaImage == null) {
return;
}
FirebaseVisionImage firebaseVisionImage = FirebaseVisionImage.fromMediaImage(mediaImage,
rotationDegrees);
FirebaseVisionTextRecognizer detector =
FirebaseVision.getInstance().getOnDeviceTextRecognizer();
detector.processImage(firebaseVisionImage)
.addOnSuccessListener(firebaseVisionText -> {
// Task completed successfully
String text = firebaseVisionText.getText();
if (!text.isEmpty()) {
if (firstValidFrame == 0)
firstValidFrame = frames;
validFrames++;
}
mTextView.setText(text);
image.close();
})
.addOnFailureListener(
e -> {
Log.e("Error", e.toString());
image.close();
});
});
camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview);
}
private int degreesToFirebaseRotation(int degrees) {
switch (degrees) {
case 0:
return FirebaseVisionImageMetadata.ROTATION_0;
case 90:
return FirebaseVisionImageMetadata.ROTATION_90;
case 180:
return FirebaseVisionImageMetadata.ROTATION_180;
case 270:
return FirebaseVisionImageMetadata.ROTATION_270;
default:
throw new IllegalArgumentException(
"Rotation must be 0, 90, 180, or 270.");
}
}
【问题讨论】:
标签: java android kotlin firebase-mlkit android-camerax