You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 04:31:05