ex1 Image Formation
814字约3分钟
2024-11-24
1 Lighting
要完成 get_face_color
功能,需要根据给定的法向量和点光源方向,使用渲染方程计算光强度。渲染方程为:
Lo(x,ωo)=Le(x,ωo)+∫Ωf(x,ωi,ωo)Li(x,ωi)(n⋅ωi)dωi
但是,在该情况下,假设表面不发光 ( Le(x,ωo)=0 ) 并且 BRDF 项 ( f(x,ωi,ωo) ) 始终为 1 ,因此,简化形式变为:
Lo(x,ωo)=∫ΩLi(x,ωi)(n⋅ωi)dωi
对于点光源,可以进一步简化为:
Lo(x,ωo)=Li(x,ωi)(n⋅ωi)
Li(x,ωi) 是入射光强度为 1
, ωi 是光方向,代码实现:
light_intensity = np.dot(normal, -point_light_direction)
normal 与 point_light_direction 夹角为钝角,取负数使点乘后结果为正
2 Projection
透视投影 Perspective-Project 和正交投影 Orthographic-Projecte 最相似的情况通常是当透视投影的焦距非常大时。在透视投影中,焦距决定了投影的“透视效应”有多强。当焦距非常大时,透视效应几乎被消除,因此透视投影的结果看起来和正交投影非常相似。
3 DLT算法求解单应性矩阵
原理:
单应性矩阵描述了两个图像之间的投影变换关系
下面是DLT算法的基本原理:
- 构建投影方程: 对于两个图像中的对应点 (x,y,1) 和 (u,v,1) ,投影关系可以用齐次坐标表示为 cuv1=Hxy1 。这里的 H( 3×3 矩阵)是我们要求解的单应性矩阵
H=h1h4h7h2h5h8h3h6h9
- 构建矩阵 A: 将投影方程展开成 Ah=0 的形式,其中 A 是一个 2n×9 的矩阵, h 是包含矩阵 H 所有元素的列向量
A=−x10⋮−xn0−y10⋮−yn0−10⋮−100−x1⋮0−xn0−y1⋮0−yn0−1⋮0−1u1x1v1x1⋮unxnvnxnu1y1v1y1⋮unynvnynu1v1⋮unvn
h=[h1h2h3h4h5h6h7h8h9]
奇异值分解(SVD): 对矩阵 A 进行奇异值分解,得到 A=UΣVT。取 VT 的最后一列作为 h 的估计
方程的最小二乘解有一个既定的结论,即对 A 进行SVD分解,得到的 VT 的最后一行 即是 h 的解,对 h 做 reshape 得到 H 。
实现:
根据你提供的信息,DLT(Direct Linear Transform)算法用于通过最小二乘法来估计单应性矩阵 H,以拟合两组特征点之间的关系。下面是DLT算法的具体步骤:
- 构建矩阵 A: 对于每一对特征点 (x,y,1) 和 (u,v,1),构建一个对应的矩阵 Ai。将所有这些矩阵堆叠成一个大矩阵 A
Ai=[−x0−y0−100−x0−y0−1uxuxvyvyuvuv]
SVD分解: 对矩阵 A 进行奇异值分解(SVD),得到 A=UΣVT 。取 VT 矩阵的最后一行作为矩阵 h
Reshape: 将向量 h reshape 为 3×3 的单应性矩阵 H