如何在Android CameraX中获取INTRINSIC MATRIX(内参矩阵)
在Android CameraX中获取相机内参矩阵(Intrinsic Matrix)
核心思路
CameraX本身没有直接暴露内参矩阵的API,但可以通过Camera2Interop工具类访问原生Camera2的CameraCharacteristics,从中提取内参数据。
步骤实现
1. 确保依赖齐全
在模块的build.gradle(或build.gradle.kts)中添加CameraX核心及Camera2扩展依赖:
dependencies { def camerax_version = "1.3.0" implementation "androidx.camera:camera-core:$camerax_version" implementation "androidx.camera:camera-camera2:$camerax_version" // 按需添加生命周期、预览等组件依赖 implementation "androidx.camera:camera-lifecycle:$camerax_version" implementation "androidx.camera:camera-view:$camerax_version" }
2. 获取CameraInfo实例
通过ProcessCameraProvider获取目标相机的CameraInfo:
val cameraProviderFuture = ProcessCameraProvider.getInstance(context) cameraProviderFuture.addListener({ val cameraProvider = cameraProviderFuture.get() // 选择目标相机(例:后置相机) val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA val cameraInfo = cameraProvider.getCameraInfo(cameraSelector) // 在这里处理内参获取逻辑 }, ContextCompat.getMainExecutor(context))
3. 提取内参矩阵
用Camera2Interop.Unwrap获取原生CameraCharacteristics,再通过LENS_INTRINSIC_CALIBRATION key提取内参数组:
val characteristics = Camera2Interop.Unwrap.unwrap(cameraInfo) val intrinsicArray = characteristics.get(CameraCharacteristics.LENS_INTRINSIC_CALIBRATION)
4. 解析并展示内参
LENS_INTRINSIC_CALIBRATION返回的是长度为9的float数组,对应3x3内参矩阵:
[fx, 0, cx, 0, fy, cy, 0, 0, 1]
解析后可以格式化展示给用户:
intrinsicArray?.let { val fx = it[0] val cx = it[2] val fy = it[4] val cy = it[5] val displayText = """ 相机内参矩阵: [$fx, 0, $cx] [0, $fy, $cy] [0, 0, 1] """.trimIndent() // 示例:用TextView展示 yourTextView.text = displayText } ?: run { yourTextView.text = "当前设备不支持获取内参矩阵" }
5. 适配输出分辨率(可选)
如果需要对应预览/拍照的输出分辨率(而非传感器原生分辨率),需要根据尺寸比例调整内参:
// 获取传感器物理尺寸 val sensorSize = characteristics.get(CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE) // 获取预览输出尺寸(以PreviewView为例) val previewOutputSize = previewView.displaySize // 计算缩放比例 val scaleX = previewOutputSize.width / sensorSize!!.width val scaleY = previewOutputSize.height / sensorSize.height // 调整后的内参 val adjustedFx = fx * scaleX val adjustedCx = cx * scaleX val adjustedFy = fy * scaleY val adjustedCy = cy * scaleY
内容的提问来源于stack exchange,提问作者Saeed Noshadi
相关产品推荐
相关产品推荐

