You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android NDK调用Camera API 2获取相机内参问题求助

解决Android NDK Camera API 2中ACAMERA_LENS_PARAMETERS未设置的问题

首先得明确一点:ACAMERA_LENS_PARAMETERS并不是所有支持NDK Camera API 2的设备都会提供的。Camera API 2的很多元数据标签是设备厂商自主实现的,像华硕ZenFone AR这类定制化较强的机型,可能并没有返回这个标签的逻辑,或者把相机内参放到了其他元数据字段里。

接下来聊聊你关心的两个核心问题:

一、是否需要预先配置相机设备?

有可能是配置环节出了问题,你可以从这几个方向排查:

  • 确认捕获请求是否包含元数据请求:有些元数据标签需要在创建ACaptureRequest时明确指定要获取,或者需要将相机输出格式设置为特定类型(比如RAW格式)才会返回内参相关数据。你可以检查创建请求时的配置,看看是否遗漏了相关设置。
  • 检查相机设备的初始化配置:确保你打开相机时选择的是支持内参输出的相机ID(比如后置摄像头,很多前置摄像头的内参支持度较低),并且配置的预览/捕获分辨率是设备原生支持的,非拉伸的分辨率可能更易获取到完整的内参数据。

二、排查与替代方案

如果配置没问题,那大概率是设备不支持这个标签,你可以按以下步骤处理:

  1. 先确认设备是否支持该标签
    在打开相机设备后,调用ACameraMetadata_getAllTags获取该设备支持的所有元数据标签列表,遍历检查是否存在ACAMERA_LENS_PARAMETERS。如果列表里没有,就说明设备确实不提供这个参数,得换其他方式获取内参。
  2. 尝试替代的元数据标签
    你可以尝试获取这些基础参数来计算内参:
    • ACAMERA_SENSOR_INFO_PHYSICAL_SIZE:传感器物理尺寸
    • ACAMERA_LENS_FOCAL_LENGTH:镜头焦距
    • ACAMERA_SENSOR_INFO_PIXEL_ARRAY_SIZE:传感器像素阵列尺寸
      结合当前捕获的分辨率,就能计算出相机的内参矩阵(fx、fy、cx、cy)。
  3. 折中方案:通过Java层传递内参
    如果NDK层的Camera API适配有问题,可以先在Java层用Camera2 API获取内参(Java层的Camera2对不同设备的适配通常更完善),再通过JNI把内参数据传递到NDK层使用,这也是很多开发者会用的规避设备适配问题的方法。

另外,针对你提供的回调代码,你可以在回调里先判断标签是否存在,避免直接访问导致错误:

static void myResultCallback( void* context, ACameraCaptureSession* session, ACaptureRequest* request, const ACameraMetadata* result){
    ACameraMetadata_const_entry entry;
    int32_t err = ACameraMetadata_getConstEntry(result, ACAMERA_LENS_PARAMETERS, &entry);
    if (err != ACAMERA_OK) {
        // 标签不存在,在这里处理异常逻辑,比如用替代方案获取内参
        LOGE("ACAMERA_LENS_PARAMETERS is not available on this device");
        return;
    }
    // 正常处理获取到的参数
    // ...
}

内容的提问来源于stack exchange,提问作者TomBlo

火山引擎 最新活动