首页 > 解决方案 > 如何对相机预览帧进行图像分析?

问题描述

我正在尝试构建一个 QR 码扫描仪和一个要添加的好功能是 Camera Preview ,但现在我也想采用相同的图像帧进行处理。我发现它可以完成的最好方法是使用 ImageAnalysis 类。下面是我的实现,不幸的是我不知道这是否是正确的实现,因为它不起作用。我也不确定我是否正确传递了“Executor”参数。有人可以在这里帮助我们吗?谢谢你。

public class MainActivity extends AppCompatActivity {

    PreviewView previewView_main;
    ListenableFuture<ProcessCameraProvider> cameraProviderFuture;
    CameraSelector cameraSelector;
    Preview preview;
    ProcessCameraProvider cameraProvider;
    private final int CAMERA_REQUEST_CODE = 101;

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        previewView_main = findViewById(R.id.previewView_main);
        cameraProviderFuture = ProcessCameraProvider.getInstance(this);
        cameraSelector = new CameraSelector.Builder()
                .requireLensFacing(CameraSelector.LENS_FACING_BACK)
                .build();
        preview = new Preview.Builder().build();

        try {
            cameraProvider = cameraProviderFuture.get();
        } catch (ExecutionException | InterruptedException e) {
            // This should never be reached.
        }


        ask_permissions();

    }


    //=============================================================================

    private void load_camera_preview() {

        cameraProviderFuture.addListener(() -> {
            bindPreview(cameraProvider);
        }, ContextCompat.getMainExecutor(this));

        draw_preview_rectangle();

    }

    private void bindPreview(ProcessCameraProvider cameraProvider) {

        preview.setSurfaceProvider(previewView_main.getSurfaceProvider());

        // ImageAnalysis for processing camera preview frames
        ImageAnalysis imageAnalysis =
                new ImageAnalysis.Builder()
                        .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
                        .build();

        Executor executor = new Executor() {
            @Override
            public void execute(Runnable command) {

            }
        };

        imageAnalysis.setAnalyzer(executor, new ImageAnalysis.Analyzer() {
            @Override
            public void analyze(@NonNull ImageProxy image) {
                Log.d("TAG", "IMAGE : " + image.getImageInfo().getRotationDegrees());
            }
        });

        cameraProvider.bindToLifecycle((LifecycleOwner) this, cameraSelector, imageAnalysis,preview);

    }


    private void ask_permissions() {

        // asks camera permission to the user.
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            String[] permissions = {Manifest.permission.CAMERA};
            ActivityCompat.requestPermissions(this, permissions, CAMERA_REQUEST_CODE);
        }

        // if permission already granted then load camera preview
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
            load_camera_preview();
        }

    }

    // Called when a request permission is denied or accepted.
    // Load camera preview in both cases
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == CAMERA_REQUEST_CODE && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            load_camera_preview();
        } else {
            load_camera_preview();
        }
    }


    //=============================================================================

    public class Box extends View {
        private Paint paint = new Paint();

        Box(Context context) {
            super(context);
        }

        @Override
        protected void onDraw(Canvas canvas) { // Override the onDraw() Method
            super.onDraw(canvas);

            paint.setStyle(Paint.Style.STROKE);
            paint.setColor(Color.GREEN);
            paint.setStrokeWidth(4);

            //center
            int x0 = getWidth() / 2;
            int y0 = getHeight() / 2;
            int dx = getHeight() / 6;
            int dy = getHeight() / 8;
            //draw guide box
            canvas.drawRect(x0 - dx, y0 - dy, x0 + dx, y0 + dy, paint);
        }
    }


    private void draw_preview_rectangle() {

        Box box = new Box(this);
        addContentView(box, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));

    }


}

activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

   <androidx.camera.view.PreviewView
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:id="@+id/previewView_main">
   </androidx.camera.view.PreviewView>


</FrameLayout>

标签: javaandroidkotlin

解决方案


推荐阅读