Как добавить цели для captureRequestBuilder и как обрабатывать каждый кадр? - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь использовать Android Camera2 для обнаружения лица / глаз. Моя проблема в том, что на нем не так много документации и некоторые функции не работают так, как я ожидаю. Мне нужно обработать каждый кадр, отправленный с камеры.

Я пытаюсь использовать captureRequestBuilder.addTarget() для отправки кадра на imageReader.OnAvailableImage(), но когда я это делаю, я больше не получаю фреймы, отправленные в сеанс предварительного просмотра.

Этот фрагмент кода ломает мой телефон предварительного просмотра камеры.

        SurfaceTexture texture = textureView.getSurfaceTexture();
        assert texture != null;
        texture.setDefaultBufferSize(imageSize.getWidth(),imageSize.getHeight());
        Surface surface = new Surface(texture);
        ArrayList<Surface> surfaces = new ArrayList<>();
        surfaces.add(surface);
        surfaces.add(imageReader.getSurface());
        captureRequestBuilder = cameraDevice.createCaptureRequest(cameraDevice.TEMPLATE_PREVIEW);
        captureRequestBuilder.addTarget(surface);
        captureRequestBuilder.addTarget(imageReader.getSurface());
        cameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() {

Но если я делаю это так, предварительный просмотр работает, но я не могу найти способ обработать кадры

        SurfaceTexture texture = textureView.getSurfaceTexture();
        assert texture != null;
        texture.setDefaultBufferSize(imageSize.getWidth(),imageSize.getHeight());
        Surface surface = new Surface(texture);
        captureRequestBuilder = cameraDevice.createCaptureRequest(cameraDevice.TEMPLATE_PREVIEW);
        captureRequestBuilder.addTarget(surface);
        cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {

это ImageReader

ImageReader reader = ImageReader.newInstance(width,height,ImageFormat.JPEG,1);
        List<Surface> outputSurface = new ArrayList<>(2);
        outputSurface.add(reader.getSurface());
        outputSurface.add(new Surface(textureView.getSurfaceTexture()));

        int rotation = getWindowManager().getDefaultDisplay().getRotation();
        ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() {
            @Override
            public void onImageAvailable(ImageReader reader) {
                Image image = null;
                try
                {
                    image = reader.acquireLatestImage();
                    ByteBuffer buffer = image.getPlanes()[0].getBuffer();
                    byte[] bytes = new byte[buffer.capacity()];
                    buffer.get(bytes);
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
                finally {
                    {
                        if (image != null)
                            image.close();
                    }
                }
            }
        };
        reader.setOnImageAvailableListener(readerListener,mBackgroundHandler);

Кто-нибудь может мне помочь с обработкой кадров Camera2 в реальном времени?

...