繁体   English   中英

ARCORE 与 Camera2 共享相机时的图像捕获 API

[英]Image capture when ARCORE sharing camera with Camera2 API

我正在尝试使用 ARCORE 捕获图像。 遵循此代表 ( https://github.com/google-ar/arcore-android-sdk ) 上提供的共享相机示例的代码库,并实现了构建相机捕获请求的代码。

我正在使用一个图像阅读器进行预览,另一个使用高分辨率进行捕获,这是允许的( https://developers.google.com/ar/develop/java/camera-sharing )。

在构建请求时,出现“java.lang.IllegalArgumentException:CaptureRequest 包含未配置的输入/输出表面”的异常。 并且我已经将图像读取器表面添加到共享相机配置站点上提到的表面列表中。

这是捕获请求构建器的代码:

public void shotPhoto() {
    try {

      // Get the characteristics for the ARCore camera.
      CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(this.cameraId);

      // Get the higher resolution for image capture
      StreamConfigurationMap streamConfigurationMap = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
      Size[] sizes = streamConfigurationMap.getOutputSizes(SurfaceTexture.class);
      int width = sizes[0].getWidth();
      int height = sizes[0].getHeight();

      reader = ImageReader.newInstance(
                      width,
                      height,
                      ImageFormat.JPEG,
                      2);
      reader.setOnImageAvailableListener(this, backgroundHandler);

      sharedCamera.setAppSurfaces(this.cameraId, Arrays.asList(reader.getSurface()));

      CaptureRequest.Builder captureRequestBuilder = cameraDevice.createCaptureRequest(cameraDevice.TEMPLATE_STILL_CAPTURE);
      captureRequestBuilder.addTarget(reader.getSurface());
      captureRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION, SensorOrientation);
      CaptureRequest captureRequest = captureRequestBuilder.build();
      captureSession.capture(captureRequest, cameraCaptureCallback, backgroundHandler);

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

我意识到这是一个相当古老的问题,但最近遇到了这个问题,我想我会添加一个答案。

ImageReader 的表面需要在传递给 cameraDevice.createCaptureSession 的表面列表中。 但是您只想拍摄快照 - 您不希望它在每一帧上都填充 - 所以不要将它添加到 captureSession.setRepeatingRequest 的表面列表中,也不要调用 sharedCamera.setAppSurfaces。

当然,这意味着您需要在程序执行的早期创建 ImageReader,以便在您创建捕获 session 时它的表面可用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM