Приложение для анализа изображений CameraX не запускает метод анализа

#java #android #image-processing #camera #raspberry-pi3

Вопрос:

Я разрабатываю приложение camerax для случая использования анализа изображений. Я собрал его и запустил на своем телефоне, и он отлично работал. Я также попробовал это на нескольких других телефонах, и на них это тоже сработало. На самом деле мы планируем использовать приложение на нашем raspberry pi 3B, в котором установлены линейки и подключены необходимые камеры, а также мы пробовали запускать другие приложения, использующие камеру, и оно отлично работало. Но когда я запустил наше приложение, оно запустилось, показало анимацию, которую должно было показывать, и больше ничего не произошло, как будто приложение не рухнуло, мы также заметили, что камера несколько раз включалась и выключалась, но это все. Из журналов я мог видеть, что приложение никогда не запускает код в блоке setAnalyzer (). Вот код для соответствующей части.

 

        model=new LocalModel.Builder()
                .setAssetFilePath("model.tflite")
                .build();

        CustomImageLabelerOptions customImageLabelerOptions=new CustomImageLabelerOptions.Builder(model)
                .setConfidenceThreshold(.98f)
                .setMaxResultCount(1)
                .build();

        labeler= ImageLabeling.getClient(customImageLabelerOptions);

        analysis=new ImageAnalysis.Builder().setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
                .setTargetResolution(new Size(1280, 720))
                .build();

        Log.i(TAG, "before the analysis starts");

        analysis.setAnalyzer(ContextCompat.getMainExecutor(this), image -> {
            Log.i(TAG, "Analysis started");
            int rotationDegrees = image.getImageInfo().getRotationDegrees();
            @SuppressLint("UnsafeOptInUsageError") Image mediaImage=image.getImage();
            if(mediaImage!=null){
                InputImage i=InputImage.fromMediaImage(mediaImage, rotationDegrees);

                labeler.process(i).addOnSuccessListener(new OnSuccessListener<List<ImageLabel>>() {
                    @Override
                    public void onSuccess(@NonNull @NotNull List<ImageLabel> imageLabels) {
                        Log.i(TAG, "successfully started to process the image");
                        String labels="";
                        for(ImageLabel label: imageLabels){
                            Log.i(TAG, label.getText());
                            labels=label.getText();
                            Log.i(TAG, labels);
                        }

                        if(labels.equalsIgnoreCase("dew")) {
                            isDetectingBottles=true;
                            d.stop();
                            imageView.setBackgroundResource(R.drawable.unnffffamed);
                        }
                        else{
                            if(isDetectingBottles){
                                isDetectingBottles=false;
                                imageView.setBackgroundResource(R.drawable.blink_animation);
                                d= (AnimationDrawable) imageView.getBackground();
                                d.start();
                            }
                        }
                        image.close();
                    }


                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull @NotNull Exception e) {
                        Log.i(TAG, "ImageLabeling process failed");
                        e.printStackTrace();
                        image.close();
                    }
                });
            }
        });

        CameraSelector selector= CameraSelector.DEFAULT_BACK_CAMERA;

        Log.i(TAG, "before binding to lifecycle");

        ListenableFuture<ProcessCameraProvider> m=ProcessCameraProvider.getInstance(this);
        m.addListener(new Runnable() {
            @Override
            public void run() {
               try {
                   m.get().bindToLifecycle((LifecycleOwner) MainActivity.this, selector, analysis);
               }
               catch(InterruptedException e){
                   e.printStackTrace();
               }
               catch(ExecutionException e){
                   e.printStackTrace();
               }
            }
        }, ContextCompat.getMainExecutor(this));

 

Вот несколько вещей, которые я попробовал:

  1. В начале я не устанавливал никакого целевого разрешения и оставил его на camerax, но тогда это все еще не работало.
  2. Я пробовал использовать разные камеры с селектором, использование фронтальной камеры приводит к сбою.
  3. Попытался вызвать image.close() в конце блока setAnalyzer, но это, очевидно, не проблема, так как он работает на других устройствах.

ПРИМЕЧАНИЕ: журналы не показывают никаких исключений, чтобы я мог понять, что происходит.

Комментарии:

1. что произойдет, если вы переоденетесь ContextCompat.getMainExecutor(this) analysis.setAnalyzer(ContextCompat.getMainExecutor(this), image -> { с Executors.newSingleThreadExecutor() ?

2. никаких изменений, все так же ведет себя