前言
在童年时期,有一个东西时常能给我带来欢乐,那就是哈哈镜。哈哈镜不是传统的平面镜,而是凹凸不平的镜面。当人们来到镜子面前时,镜子中的自己会发生奇怪的扭曲,带来欢笑声。
这篇博文的主要动机是鼓励读者去学习相机的内外参数,相机的投影矩阵以及如何使用几何来表现图像。
通过这篇文章,我希望读者能够了解到一个事实,那就是如果想要创建一个有趣的东西,必须要有相对应的明确的概念和理论。
形成图像的理论
简单来说,一张图像其实是一个三维世界场景的二维投影。而要将无数个三维点进行投影,需要使用下述公式:
其中, P P P为相机的投影矩阵, X w , Y w , Z w X_w,Y_w,Z_w Xw,Yw,Zw为三维空间的点坐标, u , v u,v u,v为二维空间的像素坐标。
如何实现
整个哈哈镜项目主要分为三个步骤:
- 创建虚拟摄像机
- 定义一个三维曲面(镜面),并使用合适的投影矩阵将该曲面投影到虚拟相机当中。
- 将三维曲面投影点的图像坐标应用于图像网格的扭曲,以获得哈哈镜的效果。
整个步骤如下图所示。
图1: 创建哈哈镜的步骤图。第一步,创建三维曲面(左图);第二步,使用虚拟相机捕获平面,得到对应的二维点(中图);第三步,将得到的二维点应用到网格变形,得到最终的效果(右图)。
如果大伙暂时还未理解,别担心,后面会详细解释每一步。
创建虚拟相机
从上述的介绍可以知道一个三维点是如何使用投影矩阵然后得到二维坐标点的。现在让我们了解一下虚拟相机的含义,以及如何使用这个虚拟相机来拍摄图像。
虚拟相机的本质是投影矩阵 P P P,因为它告诉我们3D世界坐标和响应的图像像素坐标之间的关系。我们知道,一个投影矩阵是由相机内参矩阵( K K K)和相机外参( M 1 M_1 M1)矩阵组成。