计算机视觉实验LAB——照相机标定与位姿计算(上)

本文探讨了相机模型,特别是经典透视相机,并介绍了相机标定过程,这是一个确定相机内在和外在参数的非线性方程组求解问题。通过解析相机的内在参数矩阵和旋转平移矩阵,建立了空间点与像素坐标的关系。同时,讨论了非线性优化方法如梯度下降、牛顿-拉弗森和勒维恩伯格-马夸特法在解决重投影几何误差最小化问题中的应用。
摘要由CSDN通过智能技术生成

Camera models

我们使用了一个名为GenericCamemra的virtual class类型来定义任何一种相机模型。这一点很重要,你可以品尝到编程的灵魂味道就在这里面: )

C++接口描述了类的行为和功能,而不需要完成类的特定实现。
C++接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。
设计抽象类(通常称为 ABC)的目的,是为了给其他类提供一个可以继承的适当的基类。抽象类不能被用于实例化对象,它只能作为接口使用。如果试图实例化一个抽象类的对象,会导致编译错误。
因此,如果一个 ABC 的子类需要被实例化,则必须实现每个虚函数,这也意味着 C++ 支持使用 ABC 声明接口。如果没有在派生类中重写纯虚函数,就尝试实例化该类的对象,会导致编译错误。
可用于实例化对象的类被称为具体类。

基类 GenericCamera 提供了很多不同相机模式共同需要的接口(使用virtual void),在派生类 PerspectiveCamera 和 DistortionCamera 中分别用不同的算法来实现相关计算。

class GenericCamera//基类
{
   
public:

    vpColVector xi_;

    GenericCamera() {
   }
    // get the number of intrinsic parameters
    unsigned int nbParam() {
   return xi_.getRows();}

    virtual void project(const vpPoint &_P, double &_u, double &_v) = 0;
    virtual void computeJacobianIntrinsic(const vpPoint &_P, vpMatrix &_J) = 0;
    virtual void computeJacobianExtrinsic(const vpPoint &_P, vpMatrix &_L) = 0;
    virtual void updateIntrinsic(const vpColVector &_dxi) = 0;
};

我们可以学习这种设计策略(哈哈,认真体会下面这段引用,我觉得说的很好:)

面向对象的系统可能会使用一个抽象基类为所有的外部应用程序提供一个适当的、通用的、标准化的接口。然后,派生类通过继承抽象基类,就把所有类似的操作都继承下来。
外部应用程序提供的功能(即公有函数)在抽象基类中是以纯虚函数的形式存在的。这些纯虚函数在相应的派生类中被实现。 这个架构也使得新的应用程序可以很容易地被添加到系统中,即使是在系统被定义之后依然可以如此。

现在,我们从这段基类的程序片段来学习相机的建模。
就像人类婴儿清澈透明的眼睛一样重要,相机作为我们机器人一组感知世界的起点,TA的重要性是不言而喻的。

Classic Perspective Camera

你如果还记得中学物理课学过的小孔成像的原理的话,就不难理解我们如何把三维空间的一个物体投射到一个平面上了。(图片来源机器人学,机器视觉与Matlab算法基础)
图片来源机器视觉

一个小洞察,就像一个小幽默,影响深远。——艾伦.克莱因

下面我们开始分析经典的照相机建模方法如何用照相机实现。
结合中央透视原理和相似三角形数学知识,世界坐标系下某一点P ( X w , Y w , Z w ) (X_w,Y_w,Z_w) (Xw,Yw,Zw),齐次表示 P ~ ( X w , Y w , Z w , 1 ) \tilde P(X_w,Y_w,Z_w,1) P~(Xw,Yw,Zw,1)在相机坐标下表示
c P = c T w P ^cP = ^cT_wP cP=cTwP
c P = [ r 1 1 r 1 2 r 1 3 ∣ t x r 2 1 r 2 2 r 2 3 ∣ t y r 3 1 r 3 2 r 3 3 ∣ t z ] [ X w Y w Z w 1 ] ^cP = \begin{bmatrix} r_11&r_12&r_13&\vert t_x\\ r_21&r_22&r_23&\vert t_y\\ r_31&r_32&r_33&\vert t_z\\ \end{bmatrix}\begin{bmatrix} X_w\\ Y_w\\ Z_w\\ 1 \end{bmatrix} cP=r11r21r31r12r2

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥鼠路易

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值