从像素坐标到相机坐标_一步步用c++实现相机标定(张氏标定法)

本文详细介绍了相机标定的过程,包括世界坐标系到相机坐标系、相机坐标系到理想图像坐标系的转换,以及如何通过标定板计算内参、外参和畸变参数。通过C++重新实现相机标定,使用ceres库进行非线性优化,以求得更精确的模型参数。
摘要由CSDN通过智能技术生成
enazoe/camera_calibration_cpp​github.com
0d5ad01fbfaae40be2daa873b5da56c6.png

前言

最近在做相机标定方面的工作,虽然以前多次进行相机标定,但是多数时候是调用opencv的函数,过程相对简单。虽然对标定过程有一定的了解,但是掌握的不是很扎实,所以趁这次机会,对相机标定过程做了一下深入的了解,并且用c++重新实现了下整个标定过程(opencv 中有源码,但是有点乱我没太看懂,有可能我比较渣渣),所以这是篇学习笔记。其中有些自己的理解,所以难免有错误的地方,还望指正,抱拳。

小学时候大家都做过小孔成像实验,当孔足够小的时候,在小孔的另一端我们能看到物体的倒立成像,但是当小孔变大的时候图像的不同部分发出的光线会在孔另一端的屏幕上重叠成像就不清晰了。现代相机正是依据小孔成像原理制作的,由于亮度等其他原因,使用镜头代替了小孔。同时镜头又给成像带来了其他问题,比如说畸变。

标定的目的

相机的作用是把看到的3D世界转换成2D图像,相当于我的输入是三维数据经过一个函数把他变成二维数据。我们想找到这个理想的函数,那么从数学角度先对这个问题进行建模,也就是相机的成像模型+畸变模型,而标定的目的就是通过观察到的数据,去无线逼近这个函数,也就是逼近这个理想模型的参数。

相机模型(透视投影模型,成像过程)

在看相机模型前先明确几个坐标系

世界坐标系: 单位m,三维世界的坐标系,用户在描述真实世界位置而引入的坐标系,后面我们把棋盘板坐标系看作世界坐标系。

相机坐标系: 单位m,通常原点在光心,z轴与光轴平行,为了描述物体和相机的相对位置而引入。

图像坐标系: 单位m,原点位于sensor中心,比如ccd相机的sensor中心,xy轴分别平行于sensor的两个边。

像素坐标系: 单位像素,这个是我们最常见的用于描述图片的,比如从相机读取出来的图片,原点在图片左上角。

c5cde51d6f62d01a54e9ebf0be0fa429.png

图1 source:mathworks

上图是各坐标系间的关系,

为世界坐标系,
(图中
处)为相机坐标系,
为图像坐标系,
为像素坐标系,下面逐步分析坐标系间的转换关系。

世界坐标系 -> 相机坐标系

世界坐标系到相机坐标系是一个刚体变换过程,刚体变换可以用一个旋转矩阵(也可以为旋转向量、欧拉角、四元数,程序中对外参进行优化时就是利用旋转向量这种紧凑的表示方法进行优化,后文会提到)和平移向量来表示。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值