«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

올해는 머신러닝이다.

Android 카메라 줌 관련 정리 본문

스터디/Android

Android 카메라 줌 관련 정리

행복한 수지아빠 2025. 2. 7. 09:56

안드로이드에서 카메라 라이브러리를 사용할 때 광학 줌(Optical Zoom) 또는 디지털 줌(Digital Zoom) 을 활용하여 더 멀리 보는 기능을 구현할 수 있습니다. 다만, 하드웨어적으로 지원되는 카메라 모듈(예: 망원 렌즈)이 있는지 여부에 따라 방법이 달라집니다.


1. 카메라 렌즈 변경 (망원 렌즈 사용)

안드로이드 Camera2 API 또는 CameraX를 사용하면 여러 개의 렌즈(예: 초광각, 기본, 망원)를 선택할 수 있습니다. 망원 렌즈를 사용하면 더 먼 거리의 물체를 촬영할 수 있습니다.

Camera2 API를 사용하여 망원 렌즈 선택

val cameraManager = getSystemService(Context.CAMERA_SERVICE) as CameraManager
for (cameraId in cameraManager.cameraIdList) {
    val characteristics = cameraManager.getCameraCharacteristics(cameraId)
    val lensFacing = characteristics.get(CameraCharacteristics.LENS_FACING)

    // 망원 렌즈 (TELEPHOTO) 찾기
    val focalLengths = characteristics.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS)
    if (lensFacing == CameraCharacteristics.LENS_FACING_BACK && focalLengths != null && focalLengths.any { it > 50 }) {
        Log.d("Camera", "망원 렌즈 ID: $cameraId")
        selectedCameraId = cameraId
    }
}

설명:

  • LENS_INFO_AVAILABLE_FOCAL_LENGTHS 값을 확인하여 초점 거리가 긴(예: 50mm 이상) 카메라를 찾아야 합니다.
  • 보통 스마트폰에서는 ultra-wide(초광각), wide(일반), telephoto(망원)의 렌즈를 갖고 있으며, 제조사에 따라 지원 여부가 다릅니다.

2. 디지털 줌 활용하기

망원 렌즈가 없을 경우 디지털 줌을 이용하여 더 멀리 보는 효과를 낼 수 있습니다.

Camera2 API에서 디지털 줌 적용

val cameraCharacteristics = cameraManager.getCameraCharacteristics(selectedCameraId)
val maxZoom = cameraCharacteristics.get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM) ?: 1f

// 줌 적용 (최대 줌의 2배까지만 설정)
val zoomLevel = min(2.0f, maxZoom)
val sensorRect = cameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE)
val cropWidth = (sensorRect!!.width() / zoomLevel).toInt()
val cropHeight = (sensorRect.height() / zoomLevel).toInt()
val cropRegion = Rect(
    (sensorRect.centerX() - cropWidth / 2),
    (sensorRect.centerY() - cropHeight / 2),
    (sensorRect.centerX() + cropWidth / 2),
    (sensorRect.centerY() + cropHeight / 2)
)

captureRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION, cropRegion)

설명:

  • SCALER_CROP_REGION을 설정하여 센서에서 크롭한 영역을 확대하는 방식으로 디지털 줌을 구현합니다.
  • SCALER_AVAILABLE_MAX_DIGITAL_ZOOM 값을 확인하여 디지털 줌의 최대 배율을 결정할 수 있습니다.

3. CameraX에서 줌 적용

CameraX를 사용하는 경우, setZoomRatio() 메서드를 활용하면 간편하게 줌을 조절할 수 있습니다.

CameraX의 줌 기능 적용

camera.cameraControl.setZoomRatio(2.0f) // 2배 줌 적용

설명:

  • setZoomRatio()를 통해 쉽게 줌을 설정할 수 있으며, 망원 렌즈가 있으면 자동으로 활용됩니다.

4. 결론

망원 렌즈가 있는 경우: Camera2 API에서 해당 렌즈를 선택하여 사용.
망원 렌즈가 없는 경우: Camera2 또는 CameraX에서 디지털 줌 적용 가능.
CameraX 사용 시: setZoomRatio() 메서드 활용하면 쉽게 줌 조절 가능.

추가로 사용하려는 기기에서 지원하는 카메라 모듈 정보를 확인한 후 적용하는 것이 중요합니다! 🚀