1、问题背景
前段时间有做一个化妆镜项目,就是一面镜子上装有一个摄像头,用户对着镜子化妆时,可同时用来采集人脸信息,分析人脸用的。客户反馈抓拍静止的人脸图像时,画面正常,而当人脸稍微运动时,抓到的图像则会有运动模糊的现象。本文主要就是总结一下对于此问题的分析及处理过程。
2、问题分析
导致运动模糊的原因有很多,我们要根据实际的问题现象去做排查定位,之前有写过一篇文章分析:拍摄运动物体,产生运动模糊/拖影的原因分析
问题现象是用户距离摄像头很近的情况下(约20-50cm,也相当于我们实际照镜子的距离),轻微的晃头就会导致抓拍的人脸图像产生运动模糊。
这里可以分析得出,被摄物体距离相机比较近、人的头部不经意的运动速度比较快。所以很大一部分原因是被摄物体和相机之前产生了相对运动导致的,也就是将整个运动过程都成像在了Sensor上。
是否是ISP当中时域降噪强度开的过大导致的?这个可以调整时域降噪的强度去确认,验证是不相关的。
另一个原因是之前没考虑到的,就是景深范围。这款产品定义的是30cm对焦,查看如下的景深表只有10cm,所以实际使用时人脸稍微前后运动一下,肯定是有很大可能会超过10cm,导致成像不清晰。
所以通过如上分析,会导致人脸运动模糊的原因有两个:
a、人脸和相机相对运动导致的运动模糊。
b、镜头的景深范围过小,当运动超过景深范围时,会导致成像不清晰。
3、解决方案
a、人脸和相机相对运动导致的运动模糊;
如何避免相对运动导致的运动模糊呢?
只有当相机和被摄物体相对静止,或者相机的曝光时间大于被摄物体运动速度才可以做到,所以可通过降低曝光时间、或者提高帧率来实现,实际都是提高单帧曝光完成的速度。
如何降低曝光时间呢?
首先要确认此场景下是否已经走到最大曝光时间了,因为不同亮度场景下所用的曝光时间是不一样的,比如在室外高亮的场景下,一帧图像曝光完成可能就1-2行,此种情况下降低曝光时间用处就不大。一般的修改方法是可在驱动中去限制最大曝光行,或者AE算法中去做限制。
如何提高帧率?
降低帧率的话,一般是减小 sensor vts 的值即可,但提高帧率的话要考虑到mipi速率、带宽性能的限制,这个就要向 sensor 原厂去提需求,让他们更新相应 setting 出来才行。
另外不论是直接降低曝光时间、还是通过提高帧率来降低曝光时间,都有可能带来噪声变多、清晰度损失的副作用。因为当曝光时间走到最大,还达不到ae target值时,AE 就会通过增加 sensor 增益来达到目标亮度,一方面增益增加了,会带来更多噪声,另一方面 ISP 是根据不同增益等级去做去噪的,所以增益变大了,去噪强度就会增加,导致清晰度损失。
我们调试的此项目是通过将曝光时间降低到1/60s、帧率保持不变的情况下(不提高帧率是因为此 sensor 在full size的分辨率下,只支持30fps),再接着去优化 ISP 的降噪效果,提高了清晰度后才满足要求的。
b、镜头的景深范围过小,当运动超过景深范围时,会导致成像不清晰。
调试一款产品前,我们要考虑其实际的应用场景,10cm的景深范围肯定是不满足实际使用要求的,根据我们平常照镜子的需求近焦端距离10cm(像平常我们挤痘痘是需要的靠这么近的),远焦端距离100cm,所以建议景深范围10-100cm,也就是90cm内为好。