如何将目标添加到captureRequestBuilder以及如何处理每一帧?

时间:2019-01-24 12:46:40

标签: java android face-detection android-camera2

我正在尝试使用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帧吗?

0 个答案:

没有答案