相机应用中的角度问题0x01:0x02:0x03:

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

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,我们已经验证了后置摄像头算法的正确性,前置摄像头大家自行去验证。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能头条

干货 | 1400篇机器学习的文章中,这10篇是最棒的!

【导读】在过去的一个月中, 作者从近 1400 篇有关机器学习的文章中挑选了最有可能帮助职业生涯发展的 10 篇推荐给大家(入选比率为0.7%)。

14740
来自专栏数据派THU

独家 | 如何改善你的训练数据集?(附案例)

这张幻灯片是Andrej Karpathy 在Train AI 演讲的一部分,我很赞同它表达的观点。它充分体现了深度学习在研究和应用上的差异。学术论文几乎全部集...

11540
来自专栏AI科技大本营的专栏

干货 | 1400篇机器学习的文章中,这10篇是最棒的!

【导读】在过去的一个月中, 作者从近 1400 篇有关机器学习的文章中挑选了最有可能帮助职业生涯发展的 10 篇推荐给大家(入选比率为0.7%)。

10820
来自专栏量子位

谷歌有只AI,自动给黑白视频上色,走到哪它都认识你

13150
来自专栏机器之心

前沿 | 不使用深度学习,进化算法也能玩Atari游戏!

近期街机学习环境(ALE)被用于对比不同的控制器算法,从深度 Q 学习到神经进化算法。Atari 游戏的环境在一个通用界面上提供了大量不同任务、可理解的奖励度量...

12020
来自专栏达观数据

技术干货 | 推荐系统中的冷启动问题和探索利用问题

冷启动和探索利用问题是推荐系统技术中的两个关键问题,本文结合达观数据的技术实战,对问题的解决方案进行了梳理和介绍。 1 前言 互联网技术和大数据技术的迅猛发展正...

36150
来自专栏大数据文摘

我们为什么要这样联想|用哲学论证客户画像体系的复杂性

18130
来自专栏ATYUN订阅号

DeepMind用基于AI的元强化学习框架研究多巴胺在学习过程中的作用

最近,AI已经应用到一系列视频游戏中,如Atari经典的Breakout和Pong。尽管这样的表现令人印象深刻,但人工智能仍然依靠数千小时的游戏时间来达到并超越...

13350
来自专栏AI研习社

【AI听】Hinton:反向传播要被彻底放弃了!Unity推出Machine Learning,24分钟训练ImageNet……

主播 | 吴璇 选题 | 徐普 程炜 Heo 本周关键词 反向传播|Machine Learning Agents ImageNet|信息瓶颈 NO/1 Ge...

39270
来自专栏量子位

推荐系统中的冷启动和探索利用问题探讨

作者:文辉 | 达观数据 量子位 已获授权编辑发布 1.前言 互联网技术和大数据技术的迅猛发展正在时刻改变我们的生活,视频网站、资讯app、电商网站对于推荐系统...

88170

扫码关注云+社区

领取腾讯云代金券