相机投影模型总结
本文旨在总结各种不同的相机投影模型,对于具体建模原理没有涉及。
对于以下的投影操作,此处首先假设已经获得一个待投影的3d点在相机坐标系下的三维坐标[x,y,z]⊤,接下来通过相机投影后获得的二维像素坐标为[u,v]⊤。
针孔模型——pinhole
针孔相机模型一般有四个参数,记为[fx,fy,cx,cy]⊤,内参变换如下
[uv]=[fxzx+cxfyzy+cy]
Unified Camera Model
UCM有五个参数,记为[fx,fy,cx,cy,α]⊤,其中α∈[0,1],投影变换如下
d[uv]=x2+y2+z2=[fxαd+(1−α)zxfyαd+(1−α)zy]+[cxcy]
可以发现,在α=1时,UCM退化为针孔模型。上述投影中在满足如下条件时可认为投影有效:
Ω={x∈R3∣z>−wd},w={1−αα,α1−α if α≤0.5, if α>0.5,
上述投影变换其实是后人新总结的一种参数化形式,UCM最初的建模方式也是有五个参数[γx,γy,cx,cy,ξ]⊤,投影变换为
π(x,i)d=[γxξd+zxγyξd+zy]+[cxcy]=x2+y2+z2
这也是kalibr中的omni相机模型。
Extended Unified Camera Model
有人对UCM进行扩展,扩展后有六个参数[fx,fy,cx,cy,α,β]⊤,投影变换如下
d[uv]=β(x2+y2)+z2=[fxαd+(1−α)zxfyαd+(1−α)zy]+[cxcy]
当β=1时,EUCM退化成UCM.
double sphere camera model
这是tum在2018年的一篇同名论文中提出的一种用于鱼眼镜头的相机模型,逆运算具有闭式解。此模型也具有6个参数[fx,fy,cx,cy,ξ,α]⊤,投影操作如下
d1d2[uv]=x2+y2+z2=x2+y2+(ξd1+z)2=[fxαd2+(1−α)(ξd1+z)xfyαd2+(1−α)(ξd1+z)y]+[cxcy]
当满足以下条件时,可以认为上述投影有效
Ωw2w1={x∈R3∣z>−w2d1}=2w1ξ+ξ2+1w1+ξ={1−αα,α1−α if α≤0.5 if α>0.5
radial-tangential
径向切向是一种最常见的畸变模型,一般用于普通相机。此处将针孔内参模型与其组合,其参数包括针孔内参参数[fx,fy,cx,cy]⊤与畸变参数[k1,k2,p1,p2]⊤,投影过程如下
xnynr2xdyd=zx=zy=xn2+yn2=xn(1+k1r2+k2r4)+2p1xnyn+p2(r2+2xn2)=yn(1+k1r2+k2r4)+p1(r2+2yn2)+2p2xnyn
[uv]=[fxxdfyyd]+[cxcy]
Kannala-Brandt Camera Model
一般将kalibr中pinhole(内参)+equidistant(畸变)的组合就是此模型,其参数包括针孔内参参数[fx,fy,cx,cy]⊤与畸变参数[k1,k2,k3,k4]⊤,畸变参数也可以只有前两个。其整体投影过程如下:
[uv]rθd(θ)=[fxd(θ)rxfyd(θ)ry]+[cxcy]=x2+y2=atan2(r,z)=θ+k1θ3+k2θ5+k3θ7+k4θ9
这其实也是opencv中使用的鱼眼相机模型cv::fisheye,不过opencv的鱼眼相机模型与上述相比,内参变换步骤比针孔模型多了一个参数α,最终投影变换过程如下
abrθd(θ)x′y′=zx=zy=a2+b2=atan(r)=θ+k1θ3+k2θ5+k3θ7+k4θ9=(rad(θ))=(rbd(θ))
[uv]=[fx(x′+αy′)fyy′]+[cxcy]
上述两种投影中,畸变部分是相同的,内参变换部分稍有不同。其中atan2与atan函数稍有区别,但最终意图一致。
Field-of-View Camera Model
其实在kalibr中其实将FOV描述为一种畸变模型,只有一个参数w,与针孔内参模型进行组合后参数向量为[fx,fy,cx,cy,w]⊤,其投影过程如下:
ru=x2+y2rd=watan2(2rutan(2w),z)
[uv]=[fxrdruxfyrdruy]+[cxcy]
kalibr中相机模型的确定
kalibr中相机模型CameraGeometry
分类可以看作四层树的结构,每层分类依据为
-
- 内参模型(pinhole/omni/extendedUnified/DoubleSphere)
-
- 畸变模型(nodistortion/radialTangential/equidistant/Fov)
-
- 曝光方式(globalShutter/rollingShutter)
-
- 掩膜类型(nomask/指定mask)
其中与本文中相关的是内参模型+畸变模型的相机投影模型,其中每种内参模型都定义了一个模板类,而畸变方式通过内参模型类的模板参数来指定。按照上述内参与畸变的自由组合,按理来说kalibr中应该存在16种相机投影模型,但实际上kalibr中仅仅只实现了10种,如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| typedef CameraGeometry<PinholeProjection<NoDistortion>, GlobalShutter, NoMask> PinholeCameraGeometry; typedef CameraGeometry<PinholeProjection<RadialTangentialDistortion>, GlobalShutter, NoMask> DistortedPinholeCameraGeometry; typedef CameraGeometry<PinholeProjection<EquidistantDistortion>, GlobalShutter, NoMask> EquidistantDistortedPinholeCameraGeometry; typedef CameraGeometry<PinholeProjection<FovDistortion>, GlobalShutter, NoMask> FovDistortedPinholeCameraGeometry;
typedef CameraGeometry<OmniProjection<NoDistortion>, GlobalShutter, NoMask> OmniCameraGeometry; typedef CameraGeometry<OmniProjection<RadialTangentialDistortion>, GlobalShutter, NoMask> DistortedOmniCameraGeometry; typedef CameraGeometry<OmniProjection<EquidistantDistortion>, GlobalShutter, NoMask> EquidistantDistortedOmniCameraGeometry; typedef CameraGeometry<OmniProjection<FovDistortion>, GlobalShutter, NoMask> FovDistortedOmniCameraGeometry;
typedef CameraGeometry<ExtendedUnifiedProjection<NoDistortion>, GlobalShutter, NoMask> ExtendedUnifiedCameraGeometry; typedef CameraGeometry<DoubleSphereProjection<NoDistortion>, GlobalShutter, NoMask> DoubleSphereCameraGeometry;
|
- 其中针孔内参变换与四种畸变都进行了组合
- omni也和四种畸变进行了组合:首先通过omni的ξ参数进行归一化投影,然后进行畸变,最后通过omni另外四个参数进行类似针孔的内参变换。
- 剩下的EUCM与DSCM都是只实现了不加畸变的版本,就是上文中介绍的形式(其实有一部分原因是这两种模型本身就带有畸变建模)
其实可以发现kalibr想要将相机投影通过内参+畸变的形式进行划分管理,可惜很多投影模型中这两部分其实是耦合在一起的。并且不同开源库中对相同投影模型使用了不同的参数化形式,因此相机投影模型这一块在初学者看来会比较繁杂。
参考文献
[1] https://docs.opencv.org/
[2] https://github.com/ethz-asl/kalibr/
[3] The Double Sphere Camera Model (V. Usenko, N. Demmel and D. Cremers), In Proc. of the Int. Conference on 3D Vision (3DV), 2018.