美文网首页Android安全-源码分析
相机应用中的角度问题

相机应用中的角度问题

作者: difcareer | 来源:发表于2016-11-18 17:13 被阅读223次

在使用相机时,最自然的效果是不管你的手机如何旋转,手机上的成像始终是向上的,也就是说,相机内容不会随着相机的旋转和旋转。

Camera.Parameters的【setRotation(int)】就是为了实现这个效果的,其中rataion表示相机采集到的图像需要顺时针转动的角度,从而达到成像始终向上。

这个方法的解释中提到了两个角度:【OrientationEventListener】【Camera.CameraInfo】

0x01:

根据【OrientationEventListener】的解释:方法中的orientation表示手机从自然角度顺时针旋转的角度。自然角度就是手机正向竖直向上的状态(此时一般前置摄像头在最上面),看看示例图就明白了。

自然角度

于是乎,手机的几个特定旋转角度和对应的orientation是:

0度,无旋转 90度,顺时针旋转了90度 180度,顺时针旋转了180度 270度,顺时针旋转了270度

注意,这个接口在传感器检测到有旋转时就会回调,并不只是上述4个状态才会触发,当手机水平放置时,传感器将不能检测到旋转角度,orientation为-1:

-1,手机水平放置

这个接口其实挺好理解的。

0x02:

【Camera.CameraInfo】就有点复杂,文档说明了,这个角度是相机图像为了在自然方向上展示时,需要旋转的角度。

相机图像指摄像头最初采集到的图像,相机采集到的图像和相机摄像头摆放的角度有关。上述CameraInfo的文档中讲述了一个例子:假如你的手机现在在自然角度,你手机的后置摄像头的正向此时指向手机的右边框(一般手机就是这种模式,不排除某些厂商瞎搞,把摄像头角度调整成别的),那么这个角度就是90。怎么理解呢,还是来看图:

图中红色箭头表示后置摄像头的正向,这个角度是固定的,由手机厂商决定

这样不太舒服,来旋转一下,将后置摄像头正向朝上:

后置摄像头在这个状态下正向朝上

ok,弄明白摄像头的正向位置,再来看相机图像,假如手机处于自然角度,然后拍摄下面这个照片:

目标景物

拍摄时应该是这个样子:


假如你不做任何处理,你的视野和摄像头是一模一样的,此时摄像头正向的视野应该是:

这就是相机图像

于是你看到的是:


向左旋转的景象

为了让图像能够在自然方向上展示,你需要顺时针旋转90度。这个角度就是CameraInfo中的orientation值。

0x03:

回到最初,假如我们想要不关心手机的旋转状态,不关心摄像头的安装角度,我们如何获取一个始终是正向的图像呢?

【setRotation(int)】的说明文档中展示了一段代码:

 public void onOrientationChanged(int orientation) {
     if (orientation == ORIENTATION_UNKNOWN) return;
     android.hardware.Camera.CameraInfo info =
            new android.hardware.Camera.CameraInfo();
     android.hardware.Camera.getCameraInfo(cameraId, info);
     orientation = (orientation + 45) / 90 * 90;
     int rotation = 0;
     if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
         rotation = (info.orientation - orientation + 360) % 360;
     } else {  // back-facing camera
         rotation = (info.orientation + orientation) % 360;
     }
     mParameters.setRotation(rotation);
 }

它会根据上述两个角度,计算出相机图像为了正向展示需要旋转的角度,并设置到相机的参数中,至此你就能获取到正向图像了。

为啥是那样的计算公式呢?

以 后置摄像头 为例:
假如手机在自然角度:



此时OrientationEventListener回调中的orientation是0,而摄像头安装角度是固定的90度。根据前面我们的图例,此时看到的图像是向左旋转的,因此我们需要顺时针旋转90度,也就是 (0+90)%360 = 90。

假如手机是摄像头正向朝上:


后置摄像头在这个状态下正向朝上

此时直观上就能发现,相机图像是正向的,不需要做旋转(0度)。此时OrientationEventListener回调中的orientation是270,摄像头安装角度是固定的90度,也就是 (270+90)%360 = 0

ok,我们已经验证了后置摄像头算法的正确性,前置摄像头大家自行去验证。

相关文章

  • 相机应用中的角度问题

    在使用相机时,最自然的效果是不管你的手机如何旋转,手机上的成像始终是向上的,也就是说,相机内容不会随着相机的旋转和...

  • 相机的角度问题

    相机的安装角度, 旋转角度和屏幕角度 通过CameraInfo.orientation得到的是该相机出来图像需要顺...

  • 打开系统相机拍照并保存

    打开手机中的相机应用

  • 适配问题 双摄

    荣耀9 camera 获取相机问题副相机不对上层应用开放 如果必要可以查看源码 使用反射查找

  • #思考#D23—好产品的特点

    主要观点 好的产品能给用户带来效果,带来不同角度看问题的能力。 换个角度说,一个产品,能否让我们在应用中实践。在看...

  • 利用JPEG文件中的EXIF信息调整照片方向

    问题起源:竖屏应用的预览图像和拍摄的照片均旋转了90度 这个问题的原因是,在Android系统中定义了相机传感器方...

  • 深度相机-介绍

    奥比中光竟然上市了,主打产品就是深度相机,目前深度相机在应用上越来越广泛。 一、深度相机的分类: 1、结构光 介绍...

  • android中camera的基本使用

    简介 android framework包括对设备上可用的各种相机及相机功能的支持,在应用中实现拍照和录制视频,本...

  • 2018年第二篇月回顾

    一、为什么要进行月回顾-Why (一)从哲学+问题的角度 在哲学+问题关注的五大问题之一:自我探索中,应用月计划可...

  • 工业相机应用案例1:红外相机在啤酒识别中的应用

    艾丁格啤酒以其严格的质量方针与一致的品牌意识闻名遐迩。其生产过程,从原材料的选择和敲定,到灌装和熟化,都受到严格监...

网友评论

  • 薛瑄: 我又仔细斟酌了一下这篇文章,你说的摄像头这方向应该和我说的相机坐标原点是一个意思,我理解的是坐标系方向要一致。我们的理解差异在于,我认为是在相机拍照时和人眼看到的是完全一样,只是在显示的时候,进行了旋转。不知道我有没有理解对你的意思,可参考我整理的这篇博客http://blog.csdn.net/xx326664162/article/details/53350551
    difcareer: @天下大同 你的那篇文章之前我看过,对我有一定启发意义,我们说的应该是同一个意思,用坐标系说明问题有点复杂化了,摄像头就是一个死的部件,你旋转它,看到它采集的画面也是在旋转的,所以为了做到手机怎么旋转,画面不旋转,需要按照那个公式计算一下旋转角度,这应该也是我们都想说明的问题,只是说法不一样而已,我觉得我理解的方式要舒服一些,就看读者喜欢什么样表述了
  • 薛瑄:你理解错了,相机看到的永远和人看到的是一样,因为相机自己不会进行旋转处理,为什么会有旋转,是因为相机的坐标原点和屏幕的坐标原点不一样
    difcareer:@天下大同 不明白你说的是什么意思,能享有说一下么?

本文标题:相机应用中的角度问题

本文链接:https://www.haomeiwen.com/subject/difspttx.html