前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一篇文章搞懂Camx Camera facing、orientation信息

一篇文章搞懂Camx Camera facing、orientation信息

作者头像
小驰随想录
发布2022-12-20 19:24:28
1.9K0
发布2022-12-20 19:24:28
举报
文章被收录于专栏:Android Camera开发

本篇文章内容来自星球内容分享。

【问题】

前后2颗摄像头都probe成功了,应用打开后摄的时候,无法切换成功,一直打开的是前摄?如果你也遇到类似的问题,相信这篇文章能帮到你。

本篇文章主要介绍camx框架下,lens相关的facing、orientation信息。

1、android.lens.facing 的值是什么时候写入的,值是由什么来决定的?

2、camera里面roll、pitch、yaw这几个概念该如何理解?

3、总结

一、android.lens.facing 是什么时候写入的,值是根据什么来决定的?

对于了解过camera应用的同学来说,对android.lens.facing一定不陌生,我们在决定打开前摄还是后摄的时候,就是根据这个值来判断的。BACK为后摄,FRONT则为前摄。

camera相关的信息,我们可以通过adb shell dumpsys media.camera 来查看。

代码语言:javascript
复制
   android.lens.facing (80005): byte[1]
        [BACK ]

那接下来我们就来看下facing信息是什么时候写入的?

一开始,我也不清楚具体是在哪块代码里面的,所以按照我的做法,一般就是会grep查找下相关关键字,然后一步步来看查找到的相关内容。

grep查找下,基本就可以定位到lensFacing赋值的地方了(如下图所示)。

代码语言:javascript
复制
-                    switch (pCameraInfo->imageSensorFacing)
+                    /*switch (pCameraInfo->imageSensorFacing)
                     {
                         case ImageSensorFacingBack:
                             lensFacing = LensFacingBack;
@@ -1175,8 +1177,14 @@ CamxResult ChiContext::InitializeStaticMetadataPool(
                         default:
                             CAMX_ASSERT_ALWAYS_MESSAGE("Invalid Lens facing info: %d", pCameraInfo->imageSensorFacing);
                             break;
-                    }
+                    }*/
 
+                   if(0 == cameraId){
+                       lensFacing = LensFacingBack;
+                   }else if(1 == cameraId){
+                       lensFacing = LensFacingFront;
+                    }

不过我们既然都看到这一步了,不妨再继续跟踪下代码,看下pCameraInfo->imageSensorFacing 的具体逻辑。

我们跟踪进去,看下imageSensorFacing 的定义,是在HwCameraInfo结构体里面定义的。

我们再看下ImageSensorFacing都定义了哪些值(如下所示):

好了,跟踪到这一步,那我们接下来就是全局搜索 ImageSensorFacing枚举变量里面的一个值,例如:ImageSensorFacingBack,看下是在哪些地方会用到。

我们看下查找结果里面Camxhwenvironment.cpp 具体的代码逻辑:

代码语言:javascript
复制
------- camxhwenvironment.cpp
    
CamxResult HwEnvironment::GetCameraInfo(
    UINT32          cameraID,
    HwCameraInfo*   pCameraInfo
    ) const
{

    if ((NULL != pCameraInfo) && (cameraID < m_numberSensors))
    {
        UINT32 roll         = m_sensorInfoTable[cameraID].CSLCapability.roll;
        UINT32 pitch        = m_sensorInfoTable[cameraID].CSLCapability.pitch;
        UINT32 yaw          = m_sensorInfoTable[cameraID].CSLCapability.yaw;
       

        if (CamxResultSuccess == result)
        {
            pCameraInfo->imageSensorFacing = ImageSensorFacingExternal;

            if (CSLSensorPitchLevel == pitch)
            {
                if (CSLSensorYawFront == yaw)
                {
                    pCameraInfo->imageSensorFacing = ImageSensorFacingFront;
                }
                else if (CSLSensorYawRear == yaw)
                {
                    pCameraInfo->imageSensorFacing = ImageSensorFacingBack;
                }
            }

            switch (roll)
            {
                case CSLSensorRoll0:
                    pCameraInfo->imageOrientation = ImageOrientationCW0;
                    break;

                case CSLSensorRoll90:
                    pCameraInfo->imageOrientation = ImageOrientationCW90;
                    break;

                case CSLSensorRoll180:
                    pCameraInfo->imageOrientation = ImageOrientationCW180;
                    break;

                case CSLSensorRoll270:
                    pCameraInfo->imageOrientation = ImageOrientationCW270;
                    break;

                default:
                    pCameraInfo->imageSensorFacing = ImageSensorFacingExternal;
                    pCameraInfo->imageOrientation  = ImageOrientationCW0;
                    break;
            }

            pCameraInfo->mountAngle               = pitch;
          
        }
    }
  

    return result;
}

从上面的代码段,我们可以看到,pCameraInfo->imageSensorFacing 的值是由roll、pitch 这2个变量来决定的。pitch和yaw决定了facing的值,而roll则决定了orientation的值。

二、roll、pitch、yaw这几个概念该如何理解?

搞过camerabringup的同学,如果注意的话,会发现,dtsi里面,也有sensor-position-roll、sensor-position-pitch、sensor-position-yaw。

其实这几个值,就是和我们上面代码里面说的roll、pitch、yaw值是一一对应的。

代码语言:javascript
复制
&cam_cci0 {	
qcom,cam-sensor1 {
		cell-index = <1>;
		compatible = "qcom,cam-sensor";
		csiphy-sd-index = <1>;
		sensor-position-roll = <270>;
		sensor-position-pitch = <0>;
		sensor-position-yaw = <180>;

那我们到现在基本就理清楚了, android.lens.facing 、orientation值,是和dtis里面配置的sensor-position-roll、sensor-position-pitch、sensor-position-yaw直接挂钩的。

不过还有一点不清楚的是,pitch、yaw、roll,这3个值具体指的是啥?分别是沿x轴、y轴、z轴的旋转角度?

我们先来看下代码里面的定义:

pitch、yaw 英文翻译过来分别是俯仰、偏航的意思,roll则是翻滚,滚动的意思。

直接看代码的定义好像也不是很清楚,还是一头雾水。

roll 表示的是 Informs about the how sensor is mounted,这个表示的是sensor安装角度?

那是什么方向上的安装角度呢?还是不清楚。

我们继续看下代码,pitch、yaw、roll都定义了哪些值?从定义上来看,pitch值基本就是选定为0了;如果是前摄,yaw的值为0,如何是后摄,yaw的值则为180。也就是pitch和yaw的值是有明确定义和限制了。

我们再来看下roll的值,从给出的可选值的解释来看,表示的是安装角度。不过还是不清楚,这个角度是针对哪个方向来说的,参考点是什么?顺时针还是逆时针?

我们前面说到 roll决定的是orientation的值,那我们看下camera.java里面关于orientation的定义。

这段文字,基本就很好的解释了角度如何确定的问题。

首先,这个角度是顺时针方向(clockwise)来算的。然后也也举了例子:我们对着手机屏幕,如果后摄的安装是和屏幕右侧对齐的,那后摄roll值就是 90。

前摄的安装角度如果也是和屏幕右侧对齐的,那前摄roll值就是270。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小驰成长圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、android.lens.facing 是什么时候写入的,值是根据什么来决定的?
  • 二、roll、pitch、yaw这几个概念该如何理解?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档