2024년 5월 8일 수요일

CameraX Camera2 Interop 사용례

CameraX?

CameraX 는 Camera2 API(low-level API) 기반으로 만들어 졌다. CameraX 는 카메라 API 의 기기 하위 호환성을 보장하고 Camera2 API 를 사용하는 거 보다 훨씬 간단한 코드로 카메라를 사용하는 앱을 개발할 수 있게 돕는다.

Camera2Interop?

CameraX 에서 일부 Camera2 설정(low-level API) 을 적용할 수 있도록 Camera2Interop 모듈을 제공한다.

몇가지 사용 사례를 설명함.


1. 카메라 ID 얻기

예제) Github 링크

val camera = provider.bindToLifecycle(requireActivity(), camSelector)
QualitySelector
.getSupportedQualities(camera.cameraInfo)
.filter { quality ->
listOf(Quality.UHD, Quality.FHD, Quality.HD, Quality.SD)
.contains(quality)
}.also {
cameraCapabilities.add(CameraCapability(camSelector, it))
}

val info = Camera2CameraInfo.from(camera.cameraInfo)
Log.d(TAG, "Camera ID: ${info.cameraId}")

설명

  1. CameraX 의 ProcessCameraProvider.bindToLifecycle()Camera 객체를 리턴한다.
  2. Camera 안에는 cameraInfo (CameraInfo) 가 있다.
  3. Camera2Interop 의 Camera2CameraInfo.from() 은 CameraInfo 를 파라메터로 Camera2CameraInfo 를 리턴한다.
  4. Camera2CameraInfo 안에는 cameraId 값이 있다. (Camera2 의 CameraDevice ID 값과 동일)


2. CameraCharacteristics 얻기

예제) Github 링크

val exposureTimeRange = info.getCameraCharacteristic(CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE)
Log.d(TAG, "Camera Face (camera id: ${info.cameraId}) exposureTimeRange: $exposureTimeRange")
val sensitivityRange = info.getCameraCharacteristic(CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE)
Log.d(TAG, "Camera Face (camera id: ${info.cameraId}) sensitivityRange: $sensitivityRange")

설명

  1. Camera2CameraInfo 에는 getCameraCharacteristics() 함수가 있다. (Camera2 의 CameraManager.getCameraCharacteristics() 와 동일)


3. Camera2 CaptureRequest 설정

예제) AE 모드를 off 하고 exposure time(shutter speed) 와 ISO 값 조정 Github 링크

val camera = cameraProvider.bindToLifecycle(
viewLifecycleOwner,
cameraSelector,
videoCapture,
preview
)

val control = camera.cameraControl
val camControl = Camera2CameraControl.from(control)
val options = CaptureRequestOptions.Builder()
.setCaptureRequestOption(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF)
.setCaptureRequestOption(CaptureRequest.SENSOR_SENSITIVITY, 3368)
.setCaptureRequestOption(CaptureRequest.SENSOR_EXPOSURE_TIME, 38860 * 100)
.build()
camControl.captureRequestOptions = options

설명

  1. CameraX 의 ProcessCameraProvider.bindToLifecycle() 는 Camera 객체를 리턴한다.
  2. Camera 안에는 cameraControl (CameraControl) 이 있다.
  3. Camera2Interop 의 Camera2CameraControl.from() 은 CameraControl 을 파라메터로 Camera2CameraControl 를 리턴한다.
  4. Camera2CameraControl 에 captureRequestOptions 값을 설정하면 되는데 CameraRequestOptions.Builder() (Camera2 의 CaptureRequest.Builder.set() 과 유사) 를 이용한 값을 설정하면 된다.


댓글 없음:

댓글 쓰기