机器人摄像机2过程中的每个帧显示其preVIEW [英] android camera2 process each frame and display its preview

查看:1509
本文介绍了机器人摄像机2过程中的每个帧显示其preVIEW的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用 https://github.com/googlesamples/android-Camera2Basic ,但尝试修改它在某种程度上它是在surfaceview绘制在此之前,我能得到访问每一帧。
我明白了,我要补充额外的表面(ImageReader.getSurface()),并读取它的框架在这​​个回调:

 私人最终ImageReader.OnImageAvailableListener mOnImageAvailableListener
            =新ImageReader.OnImageAvailableListener(){        @覆盖
        公共无效onImageAvailable(ImageReader的读者){           Log.d(图,onImageAvailable);
            mBackgroundHandler.post(新ImageSaver(reader.acquireNextImage(),MFILE));
        }    };

问题是这样的回调函数被调用,只有当图像捕获用户,而不是一个从相机发送到preVIEW屏幕eacg框架。

下面是我想补充一下:

 私人无效createCamera previewSession(){
        尝试{
            质地表面纹理= mTextureView.getSurfaceTexture();
            断言质感!= NULL;            //我们配置默认缓冲区的大小是我们想要的相机preVIEW的大小。
            texture.setDefaultBufferSize(M previewSize.getWidth(),M previewSize.getHeight());            //这是我们需要开始preVIEW输出表面。
            面面=新的表面(质感);            //我们设置与输出表面的CaptureRequest.Builder。
            米previewRequestBuilder
                    = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_ preVIEW);
            米previewRequestBuilder.addTarget(表面);            //这里,我们创建了相机preVIEW一个CameraCaptureSession。
            mCameraDevice.createCaptureSession(Arrays.asList(表面,mImageReader.getSurface()),
                    新CameraCaptureSession.StateCallback(){                        @覆盖
                        公共无效onConfigured(CameraCaptureSession cameraCaptureSession){
                            //相机已关闭
                            如果(空== mCameraDevice){
                                返回;
                            }                            //当会话准备就绪,我们开始显示preVIEW。
                            mCaptureSession = cameraCaptureSession;
                            尝试{
                                //自动对焦应该是摄像头preVIEW连续的。
                                米previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
                                        CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
                                //闪光灯会自动启用,必要时。
                                米previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
                                        CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);                                //最后,我们开始显示相机preVIEW。
                                米previewRequest = M previewRequestBuilder.build();
                                mCaptureSession.setRepeatingRequest(M previewRequest,
                                        mCaptureCallback,mBackgroundHandler);
                                //m$p$pviewRequestBuilder.addTarget(mImageReader.getSurface());
                            }赶上(CameraAccessException E){
                                e.printStackTrace();
                            }
                        }                        @覆盖
                        公共无效onConfigureFailed(CameraCaptureSession cameraCaptureSession){
                            showToast(失败);
                        }
                    }, 空值
            );            / **将待办事项捕捉aeach帧* /
            //这是我们用它来拍照CaptureRequest.Builder。
            最后CaptureRequest.Builder captureBuilder =
                    mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
            captureBuilder.addTarget(mImageReader.getSurface());            //使用相同的曝光和自动对焦模式为preVIEW。
            captureBuilder.set(CaptureRequest.CONTROL_AF_MODE,
                    CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
            captureBuilder.set(CaptureRequest.CONTROL_AE_MODE,
                    CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);            / **结束增加了捕捉每一帧* /
        }赶上(CameraAccessException E){
            e.printStackTrace();
        }
    }


解决方案
而不是创造CaptureRequest.Builder的新实例的

,只需添加的ImageReader的表面到M previewRequestBuilder的产量目标。

I use the https://github.com/googlesamples/android-Camera2Basic, but try to modify it in a way that I could get access to each frame before it is drawn on the surfaceview. I understood, I should add additional surface (ImageReader.getSurface()), and read the frame from it in this callback:

private final ImageReader.OnImageAvailableListener mOnImageAvailableListener
            = new ImageReader.OnImageAvailableListener() {

        @Override
        public void onImageAvailable(ImageReader reader) {

           Log.d("Img", "onImageAvailable");
            mBackgroundHandler.post(new ImageSaver(reader.acquireNextImage(), mFile));
        }

    };

The problem is this callback gets called only when the image is capture by the user and not on eacg frame that is sent to preview screen from camera.

Here is what I tried to add:

private void createCameraPreviewSession() {
        try {
            SurfaceTexture texture = mTextureView.getSurfaceTexture();
            assert texture != null;

            // We configure the size of default buffer to be the size of camera preview we want.
            texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());

            // This is the output Surface we need to start preview.
            Surface surface = new Surface(texture);

            // We set up a CaptureRequest.Builder with the output Surface.
            mPreviewRequestBuilder
                    = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
            mPreviewRequestBuilder.addTarget(surface);

            // Here, we create a CameraCaptureSession for camera preview.
            mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()),
                    new CameraCaptureSession.StateCallback() {

                        @Override
                        public void onConfigured(CameraCaptureSession cameraCaptureSession) {
                            // The camera is already closed
                            if (null == mCameraDevice) {
                                return;
                            }

                            // When the session is ready, we start displaying the preview.
                            mCaptureSession = cameraCaptureSession;
                            try {
                                // Auto focus should be continuous for camera preview.
                                mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
                                        CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
                                // Flash is automatically enabled when necessary.
                                mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
                                        CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);

                                // Finally, we start displaying the camera preview.
                                mPreviewRequest = mPreviewRequestBuilder.build();
                                mCaptureSession.setRepeatingRequest(mPreviewRequest,
                                        mCaptureCallback, mBackgroundHandler);
                                //mPreviewRequestBuilder.addTarget(mImageReader.getSurface());
                            } catch (CameraAccessException e) {
                                e.printStackTrace();
                            }
                        }

                        @Override
                        public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
                            showToast("Failed");
                        }
                    }, null
            );

            /**TODO added for capturing aeach frame*/
            // This is the CaptureRequest.Builder that we use to take a picture.
            final CaptureRequest.Builder captureBuilder =
                    mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
            captureBuilder.addTarget(mImageReader.getSurface());

            // Use the same AE and AF modes as the preview.
            captureBuilder.set(CaptureRequest.CONTROL_AF_MODE,
                    CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
            captureBuilder.set(CaptureRequest.CONTROL_AE_MODE,
                    CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);

            /**end added for capture each frame*/


        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }

解决方案

Instead of creating a new instance of CaptureRequest.Builder, just add the ImageReader's Surface to the mPreviewRequestBuilder's output target.

这篇关于机器人摄像机2过程中的每个帧显示其preVIEW的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆