项目目标为将一段2D老电影转为3D立体影像,在前期讨论中,实现该目标的总体技术思路为
- 生成单张rgb影像的深度图
- 通过深度图生成点云
- 利用点云通过移动摄像机的位置,基于共线方程生成另一张立体像对
- 对生成的影像进行插值处理
- 根据一定原理(偏振光或红绿立体)将两张影像叠加生成立体效果
这个过程中需要解决的难点有
- 获取老电影段落的逐帧影像,以便于批处理
- 生成单张影像的深度图技术
- 通过深度图生成点云
- 通过点云生成核线立体影像的方法
其中第四点为本篇的讨论点,其实际上也属于一种立体匹配。
立体匹配
概念
立体匹配的目标是在两个或多个视点中匹配相应的像素点,计算视差。通俗地举例,就是人的左眼和右眼所看到的两张影像是不同的、有一定距离的,而立体匹配则是要匹配这两张影像中的同名点。
点P和Q,映射到左相机OR像面上的同一点p≡q,只要找到p和q在右相机OT像面上的对应点就可以通过三角计算估计深度。找到对应点的过程,即立体匹配。
双目立体匹配在寻找同名点的过程中,若没有任何先验约束,则对左影像每个像素,需要在右影像全图空间中进行搜索,这种暴力搜索方法不仅效率非常低,而且很容易由于各种因素(如弱纹理、重复纹理等)搜索到错误的对应点,而利用核线几何约束则是减小搜索范围,提高匹配效率且降低错误匹配的一种有效方法。
P和Q映射到左相机QR像面上的同一点p≡q,直线pq上的点对应点一定位于右像面的直线p’q’上,p’q’即为直线pq的核线(极线),这就是核线约束(极线约束)。示意图如下。
更详细的说明可以参考链接https://blog.csdn.net/rs_lys/article/details/83268491
在得到了视差图d之后,则可以根据视差获得深度图(Z = ( b × f ) / d),示意图与公式如下
总体来讲,拍摄双目图片进行立体匹配获取深度图,进行三维重建等操作的整个流程大体如下
- 摄像机标定(包括内参和外参)
- 双目图像的校正(包括畸变校正和立体校正)
- 立体匹配算法获取视差图和深度图
- 利用视差图或者深度图进行虚拟视点的合成
在没有双目相机的情况下,可以使用单个相机平行移动拍摄,外参可以通过摄像机自标定算出。 后面这一情况也是项目所需要考虑的。
基于OpenCV以及两张已有影像进行立体匹配和获取深度图的方法及示意图可参考链接https://www.cnblogs.com/riddick/p/8486223.html
问题
通常来讲,对两张影像进行了立体匹配获得了视差之后,就可以根据视差估计深度,而在我们的项目中由于只有单张影像,而且是通过资料中现成的算法来获取单张影像的深度的,因此问题就变成了如何通过单张影像以及它的深度图的点云来获取另一张左/右影像。
在项目技术路线中,是想要通过共线方程将左影像(例)所生成的点云根据视差移动一部分来生成右影像。
而点云也是通过深度图生成的,所以需要找到深度与视差的关系。
核线纠正之后的图像同名点只存在列号(固定方向上的,通常为纵向【按照摄影测量坐标系】)的差异,这种差异就称为视差(严谨来说是列方向视差,因为行方向视差通过纠正消除,所以对于核线像对,视差就指列方向视差),具体来说,视差等于同名点在左影像上的列号减去在右影像上的列号。在核线纠正后,相机坐标系的X轴与基线平行,Z轴与像平面垂直。
深度与视差
参考链接https://blog.csdn.net/rs_lys/article/details/83268491
可以根据三角关系(三角形POlOr和Ppp’相似)
进一步有
共线条件方程
由于在项目中,目标是要由一张左影像(例)获取另一张右影像(例),而且是要应用在电影中,应需要考虑到虚拟摄像机的设置,相关参数的设置也要考虑到共线方程。
这一问题由于缺乏理解暂不讨论,共线方程及其应用参考链接https://blog.csdn.net/qq_43542818/article/details/111479509,有较为清晰的分情况和相关场景的举例分析。
以上参考的链接都在文中给出,后续会继续补充博文。