128、人像模式深度揭秘:双目/ToF/单摄深度估计与虚化算法
一个让我熬夜三天的Bug
2019年某旗舰机项目,人像模式在暗光下拍出来的头发边缘像被狗啃过。PM拿着竞品样张拍桌子,算法团队说是硬件模组公差问题,硬件团队说是算法没收敛。我夹在中间,拿着示波器蹲产线盯了三天,最后发现是双目基线标定文件里一个像素偏移参数写反了——左图右图差了0.3个像素,虚化引擎直接炸了。
从那以后我养成了个习惯:每次看人像算法,先问一句“你的深度图是从哪来的”。这个问题的答案,决定了整个系统的上限。
深度估计的三条路,没有一条好走
双目立体匹配:你以为的精度,其实是假象
双目方案在手机圈被吹了五年,但真正落地时坑比想象的多。核心原理大家都知道:左右图找对应点,视差转深度。但实际工程里,纹理稀疏区域(比如白墙前的人脸)匹配点根本找不到,这时候算法会“脑补”出一个深度值,虚化效果就是灾难。
这里踩过坑:某次调试,我们用了SGBM(半全局块匹配)做基础匹配,在实验室场景下效果惊艳。结果一到户外逆光场景,左图过曝右图正常,匹配代价直接崩了。后来加了自适应曝光补偿和直方图匹配预处理,才算稳住。
代码层面,别迷信OpenCV的StereoSGBM默认参数。我习惯这样调:
// 别这样写:cv: