简体   繁体   English

如何分析我在 PreviewView (Camerax) 中看到的内容?

[英]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 .我使用CameraXPreviewViewImageAnalyzer 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM