[英]How to analyze that what i see in PreviewView (Camerax)?
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
.我使用CameraX
、 PreviewView
和ImageAnalyzer
。 My PreviewView
isn't on the entire screen but in a separate window.我的PreviewView
不在整个屏幕上,而是在单独的 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
.我只想分析我在预览视图中看到的内容,但即使我在PreviewView
不到,Analyzer 也会读取条形码。 Is it possible to get barcode which I see in PreviewView
, in other words, analyze ony PreviewView
, not the entire screen?是否可以获得我在PreviewView
中看到的条形码,换句话说,只分析PreviewView
而不是整个屏幕? 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.");
}
}
}
Please take a look at the LifecycleCameraController API.请查看LifecycleCameraController API。 If a CameraController is used with the PreviewView, the ImageProxy's crop rect will match what end user sees in PreviewView.如果 CameraController 与 PreviewView 一起使用,ImageProxy 的裁剪矩形将匹配最终用户在 PreviewView 中看到的内容。 Code sample:代码示例:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.