I am new here so firstly I would like to say "Good Morning Everyone!" ;)
Now I would like to describe my problem. I use CameraX
, PreviewView
, and ImageAnalyzer
. My PreviewView
isn't on the entire screen but in a separate window.
See image
I would like to analyze only what I see in preview view but Analyzer read barcode even if I don't see in PreviewView
. Is it possible to get barcode which I see in PreviewView
, in other words, analyze ony PreviewView
, not the entire screen? Thank you in advance.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
cameraProviderFuture = ProcessCameraProvider.getInstance(this);
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 3);
mPreviewView = findViewById(R.id.viewFinder);
detector = FirebaseVision.getInstance()
.getVisionBarcodeDetector();
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));
}
@SuppressLint("RestrictedApi")
private void bindPreview(ProcessCameraProvider cameraProvider) {
Preview preview = new Preview.Builder()
// .setTargetResolution(new Size(1920, 1680))
.setTargetAspectRatio(AspectRatio.RATIO_16_9)
.build();
CameraSelector cameraSelector = new CameraSelector.Builder()
.requireLensFacing(CameraSelector.DEFAULT_BACK_CAMERA.getLensFacing())
.build();
ImageAnalysis imageAnalysis =
new ImageAnalysis.Builder()
.setMaxResolution(new Size(150, 200))
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build();
imageAnalysis.setAnalyzer(ContextCompat.getMainExecutor(this), new ImageAnalysis.Analyzer() {
@Override
public void analyze(@NonNull ImageProxy image) {
int rotationDegrees = image.getImageInfo().getRotationDegrees();
int rotation = degreesToFirebaseRotation(rotationDegrees);
@SuppressLint("UnsafeExperimentalUsageError") Image getImage = image.getImage();
// Log.i("Format", getImage.getCropRect()+"");
FirebaseVisionImage firebaseVisionImage = FirebaseVisionImage.fromMediaImage(getImage, rotation);
detector.detectInImage(firebaseVisionImage)
.addOnSuccessListener(new OnSuccessListener<List<FirebaseVisionBarcode>>() {
@Override
public void onSuccess(List<FirebaseVisionBarcode> barcodes) {
if (!barcodes.isEmpty()) {
Rect bounds = barcodes.get(0).getBoundingBox();
Paint myPaint = new Paint();
Canvas can = new Canvas();
myPaint.setColor(Color.rgb(255, 0, 0));
myPaint.setStrokeWidth(200);
can.drawRect(bounds, myPaint);
Log.i("Result", bounds+ "");
//imageAnalysis.clear();
}
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Task failed with an exception
// ...
}
});
image.close();
}
});
mPreviewView.setPreferredImplementationMode(PreviewView.ImplementationMode.SURFACE_VIEW);
mPreviewView.setScaleType(PreviewView.ScaleType.FIT_CENTER);
preview.setSurfaceProvider(mPreviewView.createSurfaceProvider());
Camera camera = cameraProvider.bindToLifecycle((LifecycleOwner) this, cameraSelector, imageAnalysis, 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.");
}
}
}