(一)计划

  1. 实现高通原生防抖
  2. 视频防抖调研
  3. 自研防抖算法
    1. 确定技术路线:阅读相关论文和资料,熟悉防抖算法原理后确定合适的基础版本算法
    2. 数据采集:获取原始正常行走的视频以及对应的陀螺仪数据
    3. 验证算法:在PC端仿真算法,分析起来更加直观直观
    4. 优化算法:通过基础版本的验证发现问题,继续查找解决方案,给予优化
    5. 移植算法:考虑性能,针对高通设备进行移植

(二)高通660平台原生防抖

开启方法

开启防抖:

adb shell setprop persist.camera.is_type 5

开启log:

adb shell setprop persist.camera.stats.debug 49152
adb shell setprop persist.camera.imglib.logs 6
adb shell setprop persist.camera.stats.is.debug 7

判断是否生效的方法:logcat中是否出现eis3_init,如果没有出现,代表着没有初始化成功

查看代码发现需要打开m_bDISEnabled,在骁龙相机中找到有打开防抖功能的开关。但是当打开开关后,发现骁龙相机报错:不支持当前分辨率,而高通文档明显是支持的。经过网上的理解,电子防抖是需要牺牲分辨率的。分辨率改成720p就成功的打开了防抖!可以很明显的看到开启电子防抖后,视场角小了很多

存在的问题

  1. 分辨率损失严重
    由于是电子防抖,需要对图像进行裁剪,会带来分辨率和视场角的损失,下面实际测算了一下高通算法裁剪的比例:
    防抖前后视野对比
    左边的是开启防抖,右边的是关闭防抖的图像,左边的图是右边的图像经过裁剪得来的,可以算出裁剪掉的比例,大概是1/4到1/5的样子。也就是说如果需要1080p的图像,像素需要约260万像素以上的摄像头,目前的IMX290是达不到要求的。
  2. 原生防抖效果不好
    实际测试出来发现开了防抖比不开抖动还要大。
    根据高通的文档90-p2482-80_a,SDM660算是老平台,用的是EIS3.0,没有什么可以调的参数,只能开关。670/710等是新平台,用的是EIS4,在文档80-nd928-8_a中说明了一些可以调试的参数,如镜头失真模型,陀螺仪角度等,但是这些参数660都找不到。
    执法仪的镜头有严重的畸变,这就带来一个问题:同一物体在图像的不同位置呈现出来的图像不同。当防抖算法对这一物体进行旋转或平移使之稳定的时候,会带来图像的失真。
    在新平台中会用工具校准出镜头的失真模型,类似于先做一遍畸变校正再进行防抖。在2241上那种畸变较小的镜头我觉得可以试一下效果。执法仪的镜头我觉得需要用新平台可能会好一些,但是高通那边也没有个明确的说法,因为手机上用的镜头大多没有什么畸变,其次对防抖效果没有那么重视,可能需要向高通提需求。

(三)防抖调研

光学防抖与电子防抖

  1. OIS(Optical Image Stabilization)光学防抖技术:
    在模组内的陀螺仪侦测到微小的移动时,将信号传至微处理器立即计算需要补偿的位移量,然后通过补偿镜片组或者感光元件的相对位置,根据镜头的抖动方向及位移量加以补偿,从而有效的克服因相机的振动产生的影像模糊

    镜片移动式和感光元件相对移动式的差异在于,一个是移动镜片组一个是移动整个镜头或者sensor。镜片移动式常用在单反相机或一体机镜头中,利用镜组中了n组镜片做XY方向的移动达到光学防抖的效果。由于手机镜头轻、小、像面尺寸小,更容易实现感光芯片相对移动式的防抖。

    优点:防抖效果好,可做到0-20Hz/0-±10°的防抖、保证图像清晰度
    缺点:成本高、镜头或者VCM需要特别设计、芯片算法难做、功耗高、抗跌落是个隐患

  2. EIS(Electronic Image Stabilization )电子防抖:
    优点:成本低、易兼容、容易实现
    缺点:损失图像清晰度、降低sensor利用率、防抖效果较差

实测以及可行性分析

通过实测,人在走路、跑步、打斗、推搡时,穿戴在上衣口袋、帽檐、肩部的振动频率集中在5Hz;人体摆动幅度比较大,振动角度需要±5°以上。这个数据和运动相机比较类似。
电子防抖不能满足需求,在条件允许的情况下,尽量选用光学防抖。

  1. 纽扣相机镜头尺寸是:M12*9.4mm,镜头尺寸相对较小,选用感光元件相对移动式OIS技术比较合适。
  2. 纽扣相机使用场合不同于手机,人在运动时,运动频率和方向不规律,属于低频率高振幅。手机OIS现状:防抖频率和振幅较小,4-5Hz,1°左右。手机防抖不能适用
  3. 马达需要重新开模定制
  4. 由于防抖模组要给镜头一个摆动空间,所以镜头基本处于腾空状态,耐跌落会是一项隐患
  5. 模组体积会增大,原有的框架不能兼容
  6. 功耗增大,预计峰值电流有200mA

厂家调研

舜宇:研发实力、生产能力都是国内领先。实力雄厚。目前量产5Hz,±2°的手机防抖模组,无意向合作定制更高振幅的OIS模组
信利:有EIS和OIS两种技术,只做模组,防抖芯片用的ST,马达需重新开模。
三鸣科技:与HTC、华硕、舜宇、欧菲光、夏普都合作过。有自己的防抖算法芯片。已经有5Hz、±5°类似规格的样品,用在运动相机上的,效果很不错。
科宝:科宝与小蚁商议10Hz、±10°的运动相机项目,与长步道也在开发防抖产品。防抖芯片是第三方的,与小蚁合作的项目用的东芝芯片。iPhone 7的后置摄像头防抖也科宝也做过(一年内不能开放)。
其他:大部分不愿意合作定制,量少成本高利润低

(四)电子视频防抖

基本原理

目前的视频防抖主要有两个方向。一个是纯粹基于图像的,另一个是基于陀螺仪的。
不用陀螺仪稳定图像需要找到关键点,理解整张图像的移动。有一些著名的算法,SIFT,SURF,ORB,FREAK等。然而这个关键点检测器有自身的缺点:

  1. 稳定的结果高度依赖于图像的质量。低分辨率图像可能无法生成最佳功能集,还可能失焦和模糊图像
  2. 图像中的关键点图案有很多重复的,会使算法混淆,不能判断图像运动的轨迹。
  3. 如果图像中有大量的运动(例如人们在背景中行走或 一辆卡车越过马路,稳定性将因此而倾斜。关键点是跟踪移动物体而不是摄像机本身的运动。

当然还有一点原因没有讲到,基于图像防抖很吃资源,在低功耗的设备中实现基本不可能。因此我们肯定是选择用陀螺仪防抖了。利用陀螺仪感知到相机的运动角度,对图像进行旋转变换,补偿相机的运动。

挑选算法

高通的EIS是electronic image stablization。所以一开始搜索的是image stablization,图像防抖,发现大部分是多帧抖动的图片合成一张图片,适用于拍照。我们产品的定位是录像,应该视频防抖,video stablization。

参考文献

意法半导体OIS的介绍文章:Optical Image Stabilization

防抖算法论文参考:
Gyroscope-based Video Stabilisation With Auto-Calibration
Stabilizing Cell Phone Video using Inertial Measurement Sensors

比较好的参考书籍:
OpenCV3 Blueprints

事前准备

  1. 由于电子视频防抖只是让视频稳定,不能让因为运动模糊的物体复原,所以尽可能的使图像清晰。因此开启防抖时快门应该为1/100,可能会导致夜间效果不好,可以在AE算法中增加一段,在比较亮的环境下,快门上限为1/100,在比较暗的环境下,快门上限调至1/50
  2. 收集传感器和镜头等资料,算法中需要用到一些参数
  3. 准备一个视场角小畸变小的镜头,与原镜头进行效果对比