zoukankan      html  css  js  c++  java
  • 单目相机标定原理

     
     

     
     

    相机标定目的:
    获取摄像机的内参和外参矩阵,同时也会得到每一副标定图像的旋转和平移矩阵。 内参和外参可以对之后相机拍摄的图像就进行矫正,得到畸变相对很小的图像。

    原理:
    成像模型的坐标系为:世界坐标系 --> 相机坐标系 --> 图像坐标系 --> 像素坐标系

    先说从相机坐标系到图像坐标系的变换:
    从针孔成像模型说起:

     
     

     
     

     
     

    ————————————————————————————
    相机坐标系中实际的点坐标为Q(X, Y, Z)
    对应的图像(坐标系)平面上的点为 q(x, y , f)

    理想情况如上所示,但实际上成像芯片的中心通常不在光轴上。


     
     

     
     

    原本的焦距是f,这里把f拆成2个不同的焦距,一个是x轴的焦距,一个是y轴的焦距


     
     

    因此最终计算的结果为:
     
     

    将实际中的点Q(X, Y, Z)映射到投影平面上坐标为 (x , y)的点的过程称为投影变换。

    这种变换可以使用齐次坐标。


     
     

     
     
     
     

    给q(x, y)增加了一个维度w,即为q(x, y, w)


     
     

     
     

    下图所示,网上一些资料中也有这种形式:
    x0、y0为在图像平面上的主点坐标,是Cx,Cy的另一种形式,
    其中s为坐标轴倾斜参数,理想情况下为0,其他参数都是一样的。


     
     

    —————————————————————————————————
    我们已经得到了内参矩阵,能够从相机坐标系转换到图像坐标系上,
    接下来说如何得到外参矩阵,将其从世界坐标系转换到相机坐标系上

    从世界坐标系转换到相机坐标系上属于刚体变换,即不会发生形变,也就是说只有旋转平移

    公式符号说明:
    带有下标 w 的是世界坐标系
    带有下标 c 的是相机坐标系
    
    设旋转矩阵为 R, 平移矩阵为 T
    
     
     
     
     

    再把偏移矩阵T加上即可,
    偏移矩阵T为 [Tx, Ty, Tz]的转置,是X、Y、Z方向上的平移。


     
     

    将旋转矩阵R和偏移矩阵T合起来即得外参矩阵即为:


     
     

    ——————————————————————————————————
    图像坐标系和像素坐标系之间的转换:
    像素坐标系和图像坐标系都在成像平面上,只是各自的原点和度量单位不一样。
    图像坐标系的原点为相机光轴与成像平面的交点,通常情况下是成像平面的中点或者叫principal point。图像坐标系的单位为mm,属于物理单位,
    而像素坐标系的单位是pixel,我们平常描述一个像素点都是几行几列。所以
    这两者之间的转换如下:其中dx和dy表示每一列和每一行分别代表多少mm,即1pixel = dx mm
    点(u,v)为像素坐标系上的点,对应的图像坐标系上的点为(x,y)

     
     

    ——————————————————————————————————————
    有了一系列参数后就能推导整个公式了。(这里借用一下别人的图)
     
     

    相机的内参和外参可以通过张正友标定获取。通过最终的转换关系来看,
    一个三维世界中的坐标点,可以在图像中找到一个对应的像素点,

    但是反过来,通过图像中的一个点找到它在三维中对应的点就很困难,因为我们并不知道等式左边的Zc值。这个Zc可近似看做相机坐标系中相机到物体的距离。

    在我看来,二维图像中的一个点,对应在三维空间中是一条线,因此如果不知道相机剧被测物体距离,是无法从二维图像上的点推导出三维空间中某个点的坐标的。
    ————————————————————————————————
    透镜畸变
    (写了这么多,写不动了,透镜畸变原理可以在《学习OpenCV》第11章找到相关内容,挺详细的)

     
     

     
     

     
  • 相关阅读:
    小程序底部弹出式导航菜单
    Markdown-it-latex2img
    Typography convention
    排版规约
    Java String的相关性质分析
    switch表达式中可以用哪些类型
    break,continue和return的区别
    一个.java文件中有多少个类(不是内部类)?
    RabbitMQ启动配置中出现(ArgumentError) argument error xxx的错误
    问题:IDEA部署Springboot项目的时候,提示很多xxx程序包找不到
  • 原文地址:https://www.cnblogs.com/tuyile006/p/10862502.html
Copyright © 2011-2022 走看看