AndroidCameraHAL3-相机都是怎么玩的
Posted 嵌入式Max
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AndroidCameraHAL3-相机都是怎么玩的相关的知识,希望对你有一定的参考价值。
现在的手机里面摄像头数目已经到 5 个 6 个的级别了,相机的功能也不再是当初那简单直白的拍照功能了,而是在里面混入了超级多的特性,本篇文章就对目前为止手机 Camera 里面各种模式下的特性和需求规格做一个简单的介绍,应该会涵盖了当前市面上大部分的上市手机。下面会大体上按照相机的大的场景来进行分类,每一个大的应用场景下面会有一些细节子功能的补充描述,不过也会有一些其他分类方式。
原来,小小的相机 APP 里面竟然有如此多的花花肠子。
普通拍照
普通拍照就是手机第一次拿到手里打开摄像头 APP 之后的默认模式,也就是常驻模式,这个从我个人的使用体验上来看是使用率最高的一种模式。该模式下会有两种不同的拍照模式,一个是连拍、一个是单拍。不管是单拍还是连拍都可能会用到多个后置 Camera 设备(前置目前一般是只有一个),至于什么美颜啊、滤镜选择什么的这里不重点关注它,多是关心些最朴素的功能。
-
单拍
单拍现在一般都是多张照片合成的,目的是为了降噪,宽动态,提升图片质量,合成图片数量从 3~10 不等,一亿像素那种估计会稍微少几张,不然图片处理耗时就会比较长。现在的图像分辨率比较大,Sensor 的面积还比较小,都会采用多帧降噪的方式来获取比较好的图像质量。 -
连拍
触发连拍的方式就是按着拍照键不松,大概 1S 之后就会进入连拍模式,连拍一般就不会再去做多帧降噪了,就是单张连续的图片输出,比较接近于录像模式那种,连拍会有一定的图片数量限制,一般都是在 1000 次以内,这个是由规格去决定的,连拍的内部处理流程比较简单,复杂度也没有单张拍摄高。
拍照的时候是不允许切换摄像头的,这个在需求上也是合理的,在软硬件的实现上也是比较难以控制的。预览的时候是可以根据使用者选定焦距的不同而进行对应对焦范围的 Sensor 切换,并且拍照的切换过程是和录像不一样的,录像过程中是得允许摄像头进行切换的,这个在需求上也是比较合理的,软件上的实现也比拍照模式要好做一点。
现在大部分手机都有场景识别功能,算法内置会有几个常用的场景,比如人像、景物、夜晚、近焦远焦等等,有了多摄像头的存在,不仅识别会更好更快一点儿,针对不同的场景还可以切换摄像模式,最简单的焦距识别,一旦检测出来手机拍的是近景,就会主动触发 Sensor 切换到微距或者广角镜头来更好的拍摄,省去了手动调整的步骤。
目前主流的手机拍照功能也是有防抖的,不同于电子防抖(EIS),事实上拍照也做不了电子防抖,拍照时候用的是光学防抖(OIS),拿着手机轻微晃动可以看到后面镜头会跟着转动,画面当然更明显可以看出来光学防抖的作用。话说在之前的公司从电子防抖项目立项到算法设计、硬件 FPGA 验证、软件设计编写、产品化,也跟过一套流程,算法原理也了解过不少,很是羡慕手机上面动不动好几十帧的缓存序列,之前的产品都是内存省到家了,算法发挥的余地也不多(不知道有没有时间去写一个防抖算法专题,目前看起来电子防抖的应用还是挺广泛的)。
还有一个就是现在相机高像素 Sensor 都是用的 Quater Bayer 来做 RAW 的曝光处理的,具体的可以自行了解下,就是四合一的像素曝光,然后通过算法进行重采样恢复原始的分辨率,这个是因为硬件的 pixel 做的太小的话噪点会增加很多,成像质量不理想,算是成本和效果的综合考虑搞出来的方案。
录像模式
录像模式下会有开不开视频防抖的区别,以前手机上面对于视频录制的要求其实并不是特别地高,可能是因为像抖音这样的短视频 APP 还没有崛起的原因,现在逐渐的手机视频拍摄也被重视起来,什么防抖、画质、帧率等等都进行了不同程度的提升,现在手机的视频录制都在朝着电影级画质前进,当然肯定无法替代真的电影镜头拍摄,不过方向上在尽量接近。
手机上的录像目前防抖功能是必不可少的一个功能点,一般是光学防抖(OIS)和电子防抖(EIS)混合使用,但是据我对电子防抖的原理理解,它们融合到一起还是蛮难的一个点,原理上不是特别的兼容,这部分的算法整合是怎么做的我也不清楚。光学防抖比视频防抖有一个优点就是它不受环境光的变化而影响到防抖的效果,但是也由于硬件空间所限,它的防抖抑制没有电子防抖更好,但是光学防抖是不牺牲画质以及视场角的,所有的画面都是原汁原味的。而电子防抖必须得牺牲画质和视场角,视场角损失就不说了(所以都用超广角拍摄裁切来尽量保证视场角),都知道是为什么,画质也会有损失的原因是电子防抖要对原始采集到的视频做重采样,这部分需要进行插值,所以画质上会有稍许损失,另外由于算法原理,在夜间光照较低的情况下,会加剧画面的模糊程度,这是因为曝光时间较长的原因,理论上应该可以通过 ISP 调节来稍微改善,但是怎么都比不上光学防抖的画面。
录像模式会有 Live shot 功能,就是录像的时候可以点击拍照键来获取 JPEG 图片,当然这个图片的质量是没有拍照模式好的。录像模式也是可以有 HDR 功能的,一般实现是通过 Sensor 内部的 HDR 辅助功能再加上软件算法配合来完成,现在的 Sensor 内部支持好多种 HDR 的帧输出模式,比如比较普通的长短帧输出模式,还有交错曝光输出(一张 RAW 数据),索尼牛逼。
录像也有人像模式了,电影拍摄的时候经常会有突出重点的背景虚化视频,手机上面也逐渐通过算法加持支持这种模式了,具体的做法细节没了解过,不过像苹果的我看应该是用到了两个及以上的镜头进行辅助计算,通过近景远景结合的方式做视频虚化,目前的安卓手机上面倒是没有听说哪家特别宣传了这个功能,也可能是我消息不够灵通。
超级慢动作,华为之前有出一款 7680 帧的超级慢动作模式,当初在发布之前我还以为宣传册写错了,没想到啊,这 TM 竟然是真的,后来多方了解了下,华为是整了一款直出 1920 帧的 CMOS sensor,然后内部数据流处理应该是从 isp 到 SOC 后处理全部直通式不经过 DRAM,并且使用最新 C-PHY 标准,处理完毕的图像先一次性扔进 RAM 缓存,1S 大概 2.5G,RAM 里面先扔进去,然后再截取片段进行插帧处理到 7680 帧,即使是插帧也做得效果非常好,而且最终视频是 720P 的,清晰度我也看了下是很不错的,不得不说牛逼。
超级夜景
这个玩意儿我记得也是华为最先搞出来的概念(买摄像头送手机应该也是他先搞出来的好像),以前貌似大家都不是非常关心手机夜景拍摄,夜景模式主要是通过长曝光来实现画面亮度提升的效果,但是依然会带来很多问题,比如噪点多,色彩不真实,手晃动导致画面模糊等等问题。我看了下目前小米10pro 和华为的超级夜景模式对比,还是华为的表现最好,尤其是都已经黑的人眼看不到任何东西了,他拍出来的画面色彩、亮度、画面模糊程度都是目前为止最优秀的。
超级夜景模式其实平时更多是起一个:这玩意儿好牛逼啊!的作用,不过在把握好场景的情况下,拍出来的晚上景色还是很漂亮的,晚上尤其是灯光的加持,让整个画面的色彩都更加绚烂,比白天有一种莫名的情调。
专业模式
专业模式其实就是开放一大部分参数给到用户自己去设置,比如常见的光圈、焦距、感光度、快门时间、锐度、镜头、白平衡等等。普通人一般用不到这个,这一大堆参数组合下来除非是专业摄影师,否则很难搞出来一张比自动模式更好的图片。
专业模式是同一时刻只有一个摄像头在工作的,可以选择后置不同的镜头来完成拍摄任务,就跟单反换镜头差不多,当然单反一般不换感光 Sensor,手机上你没办法把镜头给拆下来换,只能连带着全部都给换了。
人像模式
人像模式一般都是固定后置 Sensor 使用的,比较常见的就是一个广角或者超广角加一个长焦,长焦镜头,非长焦镜头是用来做主拍摄画面的,长焦镜头来进行景深测量做背景虚化效果,并且 UI 上无法变焦,无法切换 Sensor 镜头。
之前用人像模式的时候基本上是需要手动定焦的,就是得在画面上面需要突出前景的地方点一下,然后才能获得比较好的虚化效果,并且虚化的前景物体有时候扣不干净,边缘总是会出现一些模糊,现在的算法基本上可以做到肉眼不可见的边缘模糊,但是不知道有没有自动定焦的,估计还是比较困难吧,尤其像我经常喜欢用人像模式拍一些景物照(不会用专业模式),算法就更难了,太难了。
判断人像模式使用的哪几颗镜头可以试着单遮住一个后置镜头看看有没有画面的变化,虚化效果没有了的话就说明这个是用来测景深的,整个图都没有了的话说明是主图(废话)。
多摄像头到底有没有用
-
平滑变焦
小米6 是双摄,但是并没有用到平滑变焦上面,我发现唯一同时用到双摄的也只有人像模式了,还有第二颗摄像头起作用的模式我只发现了专业模式,专业模式可以选择长焦或者广角镜头,其余情况下小米6 我并没有发现有用到第二颗摄像头的场景。19 年的手机不了解,只说 2020 年的,今年的手机上面摄像头的利用率比以前提高了很多,一个就是平滑变焦,可以拿手遮着其中一个镜头,然后调节 UI 焦距,会发现有那么一段时间视野是黑的。平滑变焦是为了模拟专业摄像头的真·光学变焦,尽力达到无缝衔接的程序(事实现在并不能做的无缝衔接),这里就用到了多颗摄像头的不断切换来完成此功能(说,这个摄像头切换可真真是带来不少的 bug,当时做的时候也是挺头疼)。 -
背景虚化
背景虚化需要用到几张图片联合对比进行虚化区域确定,单靠一个主打拍照的主摄像头很难或者说基本不可能做到,现在的手机上基本都有 Depth sensor 用于深度信息的获取。还有二值化的摄像头,最开始接触二值化的摄像头还是在大学做飞思卡尔比赛的赛道识别的时候,二值化摄像头易于提取轮廓信息,有的手机上也装配了二值化摄像头辅助拍摄。 -
图像合成
某些场景下,存在这样一种算法,把长焦镜头的图像经过算法运算嵌合到广角镜头图像内部,增加图像的远部细节,不知道现在手机上有没有用到,应该是有用到的。或许还有其它模式的图像合成。 -
场景识别
上面也写了这部分,具体就是可以通过多摄像头的存在进行一个辅助场景识别,提升识别正确率以及进行对应的模式切换,单摄像头要做到这些相比来说还是比较难的。
多摄像头除了主摄之外新增的摄像头本质上都是为了弥补手机空间不够而先天缺少的一些功能,毕竟现有的硬件不可能把单摄做出花来,只能通过摄像头的数量来尽量弥补缺陷,事实多摄像头确实可以一定程度上获得比单摄像头更好的使用体验。
Google CameraX
B 站、Youtube 直接搜索 CameraX 就可以看到 Google 官方对 CameraX 的介绍。CameraX 是基于 Jetpack 的一个子项目,目的是为了提供比 Camera API2 更加灵活和简便的接口,把繁琐的线程、session 管理隐藏起来,也便于第三方的 APP 去使用 Camera,开放更多的多摄能力给到第三方 APP,也为短视频录制等第三方 APP 提供更多的玩法。
根据官方的介绍,这个 CameraX 有下面几个特点:
- 简化开发步骤,加入生命周期控制,不需要从程序代码角度再加入控制打开关闭摄像头的 APP 端代码。
- 为第三方 APP 开放 HDR 和人像虚化功能。
- 开放 MultiCamera 的功能给到第三方的 APP 使用。
总之,2020 年下半年就会出现 CameraX 的实际项目应用,第三方 APP 也将加入更多的 Camera 拍摄用法,对于 APP 开发者应该也是好事,毕竟简单了很多,可以更低成本搞出更多好玩的东西来。就是对于我们底层的有点苦,得去做很多的适配,海思应该也需要做很多的适配工作来配合 android 系统的改动以开放更多的 Camera 能力给第三方 APP 使用。
以上是关于AndroidCameraHAL3-相机都是怎么玩的的主要内容,如果未能解决你的问题,请参考以下文章
AndroidCameraHAL3-MultiCamera-CameraX