DevLog
Python, TypeScript, etc...
MyPage
Python, TypeScript, etc...
2022/08/19

光学カメラ基礎

光学カメラAndroidKotlin
preview
@shiromisanta
Frontend Engineer
  •  /
目次
焦点距離(Focal Length)

焦点距離(Focal Length)

レンズの中心点からイメージセンサー(フイルム面)までの距離。カメラによって異なる。

人の目で言うと水晶体の中心から網膜までの距離。

大きいほど遠くのものを写せる。小さいほど広い範囲を写せる。

フォーカス距離(Focus Distance)

カメラからフォーカスした物体までの距離。

Android Camera2 LENS_FOCUS_DISTANCEの単位

camera2CameraControl.captureRequestOptions = CaptureRequestOptions.Builder() .setCaptureRequestOption(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AE_MODE_OFF) .setCaptureRequestOption(CaptureRequest.LENS_FOCUS_DISTANCE, 0f) .build()

単位はLENS_INFO_FOCUS_DISTANCE_CALIBRATIONの値に依存する。

public static final int LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE = 1; public static final int LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED = 2; public static final int LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED = 0;

APPROXIMATE または CALIBRATED に設定されている場合、単位はディオプター(1/メートル) 。

0.5 ディオプターは 2 メートルの焦点距離。

4 ディオプターは 0.25 メートルの焦点距離。

UNCALIBRATEDの時、LENS_INFO_MINIMUM_FOCUS_DISTANCEが最小値である以外、正確な値はないらしい。

大まかにはディオプター単位らしいが、正確ではないとのこと。

まずは以下のようにして調べるのがいいかも

// HWがAFに対応しているか Log.d("Test", packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_AUTOFOCUS).toString()) val camera = cameraProvider.bindToLifecycle( this, cameraSelector, previewUseCase, imageCaptureUseCase) val camChars = Camera2CameraInfo.extractCameraCharacteristics(camera.cameraInfo) val discoveredMinFocusDistance = camChars.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE) val focusDistanceCalibration = camChars.get(CameraCharacteristics.LENS_INFO_FOCUS_DISTANCE_CALIBRATION) Log.i("discoveredMinFocusDistance: ", "$discoveredMinFocusDistance") Log.i("focusDistanceCalibration: ", "$focusDistanceCalibration")

参考: stackoverflow

関連記事

preview
@shiromisanta 2022/08/18
光学カメラAndroidKotlin
preview
@shiromisanta 2022/07/20
Kotlin
preview
@shiromisanta 2022/07/15
AndroidKotlin
preview
@shiromisanta 2022/07/15
AndroidKotlin
2022/08/19

光学カメラ基礎

光学カメラAndroidKotlin

焦点距離(Focal Length)

レンズの中心点からイメージセンサー(フイルム面)までの距離。カメラによって異なる。

人の目で言うと水晶体の中心から網膜までの距離。

大きいほど遠くのものを写せる。小さいほど広い範囲を写せる。

フォーカス距離(Focus Distance)

カメラからフォーカスした物体までの距離。

Android Camera2 LENS_FOCUS_DISTANCEの単位

camera2CameraControl.captureRequestOptions = CaptureRequestOptions.Builder() .setCaptureRequestOption(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AE_MODE_OFF) .setCaptureRequestOption(CaptureRequest.LENS_FOCUS_DISTANCE, 0f) .build()

単位はLENS_INFO_FOCUS_DISTANCE_CALIBRATIONの値に依存する。

public static final int LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE = 1; public static final int LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED = 2; public static final int LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED = 0;

APPROXIMATE または CALIBRATED に設定されている場合、単位はディオプター(1/メートル) 。

0.5 ディオプターは 2 メートルの焦点距離。

4 ディオプターは 0.25 メートルの焦点距離。

UNCALIBRATEDの時、LENS_INFO_MINIMUM_FOCUS_DISTANCEが最小値である以外、正確な値はないらしい。

大まかにはディオプター単位らしいが、正確ではないとのこと。

まずは以下のようにして調べるのがいいかも

// HWがAFに対応しているか Log.d("Test", packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_AUTOFOCUS).toString()) val camera = cameraProvider.bindToLifecycle( this, cameraSelector, previewUseCase, imageCaptureUseCase) val camChars = Camera2CameraInfo.extractCameraCharacteristics(camera.cameraInfo) val discoveredMinFocusDistance = camChars.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE) val focusDistanceCalibration = camChars.get(CameraCharacteristics.LENS_INFO_FOCUS_DISTANCE_CALIBRATION) Log.i("discoveredMinFocusDistance: ", "$discoveredMinFocusDistance") Log.i("focusDistanceCalibration: ", "$focusDistanceCalibration")

参考: stackoverflow

関連記事

preview
@shiromisanta
Frontend Engineer
  •  /
©︎Devlog