
“简 介: 本文根据 相机标定(三)-相机成像模型[1] 中的内容整理而成,初步介绍了相机的成像模型。最后介绍了利用OpenCV中的 calibrateCamera函数进行相机参数校正的过程。
关键词: 相机参数校正,棋盘格,内参,外参01 相机结构
1.1 相机是人眼的延伸
信息社会中,相机是大众媒体、视觉艺术、将瞬间变成可以回忆的永恒的技术。现在各类图片都是有形形色色的相机拍摄的。人类对于照相机的原理最早可以追溯到 小孔成像[2] 。早在战国初期的 墨子[3] 就利用光直线传播原理介绍了小孔成像原理。直到近代使用透镜成像才开启照相设备的革命。利用透镜成像与我们的眼睛观察世界方式是相同的。

使用了数字技术的单反相机可以获得更加真实的外部世界影像,配合后期计算机图像处理还可以进一步修复图片中的不足。


1.2 什么是成像?
本质上来说,图像是真实世界场景中在二维平面(成像平面)的投影,它记录了两类信息:
几何信息:位置、点、线等; 光度信息:强度、色彩。
所以从另外一个角度来看,相机是对三维世界的降维记录的设备。虽然可以 计算机图像处理算法回复3D[4] ,但这也仅仅是计算机利用常见到的场景最大似然重新渲染的结果。
比如下面就是利用NERF(神经辐射场)让照片动起来的效果。

02 成像模型
为了更好从成像数据中获取外部世界信息,需要对相机成像进行数学刻画,也就是建立成像模型。这部分的内容包括有:
小孔成像模型( Pinhole camera model)正交投影( Orthographic projection)缩放正交投影( Scaled orthographic projection)透视投影( Perspective projection)
2.1 小孔成像模型
小孔成像模型,也是针对普通数字相机最为广泛应用的一种相机模型,是透视投影(Perspective Projection)的一种最简单的形式。

通过将像平面前置到小孔与3D物体之间,形成虚拟像平面,可以简化分析成像过程。
假设相机的投影中心位于一个欧式坐标系的原点,相机面向z轴正方向,并且成像平面(或者说焦平面)在当前坐标系下的表达为,这个数值也成为相机的焦距。那么,在小孔成像模型的作用下,如下图所示,3D空间中的一个点会被投影为成像平面上的一个2D点,也即连接相机投影中心和3D点的直线与成像平面的交点。

通过相似三角形,可以很容易看出3D点$\left( {X,Y,Z} \right)T\left( {fX/Z,fY/Z,f} \right)T$,可以看出:

上面的公式就描述了小孔成像模型下,3D点映射到2D成像平面上的关系。
为了将图像转换中与坐标原点相关的平移合并到乘法运算中,常使用齐次坐标来表示图像。比如上面公式中的三维点的齐次坐标为,二维点其次坐标为,也等价为。小孔成像转换可以表示为:

2.2 正交投影
正交投影适用于:
3D场景距离相机无限远; 所有投影线均平行于光轴。

2.3 缩放正交投影
缩放正交投影适用于:
场景深度到相机的距离; 场景中所有点的Z值均相同,如。

2.4 透视投影

2.5 相机外参
相机外参反映了相机在世界坐标空间中的位姿,可通过一个刚性变换来表示,通常包含平移和旋转。

旋转鞠准是正交的,所以:。
03 相机内参
3.1 从成像平面到像素平面
相机内的坐标原点往往是图像的左上角,这也是大多数情况下数字图片在内存存储数组起始点的位置。定义光轴与像平面的交点,成为成像主点,它的位置定为。

那么外部3D点在成像平面的坐标为:

使用齐次坐标表示为:

从上面公式可以看到使用齐次坐标的好处。公式中不再出现矩阵加法,只有矩阵 与向量之间的乘法。
最终公式可以简化表达为:
第一个阶段是标准的透视投影过程,也就是。它将3D点投影到归一化平面,即焦距的平面上的2D点,即。 第二个阶段是基于相机内参的变换,即部分。它将归一化平面坐标系中的点转化为一像素为单位的图像坐标系中。
3.2 从坐标到像素
实际相机记录数据器件都采用(CCD)对图像进行离散化,形成点阵数据。在此过程中,会出现一些记录时的相机参数。
3.2.1 像素不是正方形
当相机传感器的像素不是正方形的时候,则需要在两个方向上乘以缩放因子,代表了单位距离内的像素。

:像素(pixels)坐标; :缩放因子(pixels/mm); :焦距(mm)
可以使用 代表两个方向上的不同焦距。
3.2.2 相机主点不在原点
也就是光轴与CCD的中心有偏移。假设主点在图像上的坐标(像素)位置为,则:

那么沿着相机的Z轴,有,。
3.2.3 X轴与Y轴不垂直
理想情况下,x轴与y轴是相互垂直的。如果它们之间的夹角不是90°,则有:

3.2.4 相机内参矩阵
组合所有参数,可以得到相机的内参矩阵:

3.3 相机畸变
畸变是光学透镜固有的透视失真特性,目前所有的镜头都存在畸变,只是程度不同。畸变又分为径向畸变和切向畸变,这里只以径向畸变为例。常见的径向畸变有桶形畸变、枕形畸变等:

可以通过多项式来描述上述畸变的参数。

04 相机标定
相机标定的目的就是获取前文提到的相机内参、外参和畸变系数。通常,标定方法分为两步:
从不同角度捕获棋盘格图像; 检测角点并计算相机参数。
可使用OpenCV或其他相机标定程序来完成参数计算。
4.1 用于标定的棋盘格
棋盘格图片中具有丰富的角点,可以方便通过图片处理获得规则排列点的像素位置,从而可以获得一组真实世界中的3D位置点与成像后2D上的像素点的位置。它们之间映射关系参数可以通过最小二乘方法进行计算,也就是可以将上述过程中照相机的内参矩阵,畸变参数,外参矩阵进行计算。
下面是来自于 旋转Apriltag码[5] 博文中的图片。

4.2 相机校正过程
4.2.1 提取角点
使用函数:findChessboardCorners(image,(w,h),None);
第一个参数为图片,第二个为图片横纵角点的个数。
img = cv2.imread(outfile)
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
img = cv2.imread(outfile)
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
ret, corners = cv2.findChessboardCorners(gray, (11, 8), None)
if ret:
cv2.drawChessboardCorners(img, (8, 6), corners, ret)
plt.clf()
plt.figure(figsize=(15,15))
plt.imshow(img)

4.2.2 相机参数校正
size = gray.shape[::-1]
ret,mtx,dist,rvecs,twecs = cv2.calibrateCamera(obj_points, img_points, size, None, None)
print("ret: {}".format(ret),"mtx: {}".format(mtx),"dist: {}".format(dist),"rvecs: {}".format(rvecs),"twecs: {}".format(twecs))
print("ret:", ret)
print("mtx:\n", mtx) # 内参数矩阵
print("dist:\n", dist) # 畸变系数 distortion cofficients = (k_1,k_2,p_1,p_2,k_3)
print("rvecs:\n", rvecs) # 旋转向量 # 外参数
print("tvecs:\n", tvecs ) # 平移向量 # 外参数
ret: 0.48959099937033296
mtx: [[643.69459427 0. 570.78090348]
[ 0. 634.76121519 337.46417094]
[ 0. 0. 1. ]]
dist: [[ 1.66966910e-01 -5.52524637e-01 -1.35284932e-03 9.90815870e-05
5.24320869e-01]]
rvecs: [array([[-0.16766571],
[-0.02841835],
[-0.00905039]])]
twecs: [array([[-3.39390322],
[-1.86924141],
[ 6.80979205]])]
※ 总 结 ※
本文根据 相机标定(三)-相机成像模型[6] 中的内容整理而成,初步介绍了相机的成像模型。最后介绍了利用OpenCV中的 calibrateCamera函数进行相机参数校正的过程。
参考资料
相机标定(三)-相机成像模型: https://blog.csdn.net/cfan927/article/details/105269221
[2]小孔成像: https://baike.baidu.com/item/%E5%B0%8F%E5%AD%94%E6%88%90%E5%83%8F/866213?fr=aladdin
[3]墨子: https://baike.baidu.com/item/%E5%A2%A8%E5%AD%90/245?fromtitle=%E5%A2%A8%E7%BF%9F&fromid=850519
[4]计算机图像处理算法回复3D: https://blog.csdn.net/QbitAI/article/details/122137991?utm_source=app&app_version=4.21.0
[5]旋转Apriltag码: https://zhuoqing.blog.csdn.net/article/details/122143423
车模厂商能否用点心?
卓大大,这里的连接件可以用自己打印的吗?视频前半段(动图左边)是厂商原装的可以看到齿轮偏心问题还蛮严重的,后半段(动图右边)是我自己打印的,好了很多。

回复:如果材质相同,是可以自行打印更换的。
留个言给卓大大,刚才发现了小米买的模型车,真的是又经济又实惠啊[Lol][Lol]。价格才199元。

回复:是应该出现个“小米”吉普车组别了。
卓大,今日收到了今年的信标灯 发现了两个奇怪的地方 首先是灯板上有两个高高耸立的电容会把灯盘垫起来,我实在是不觉得这两个电容能坚强的顶过安装的压力和车模的冲击。。。。。。其次是灯盘只开了一个走线的槽,难道说串级的时候两条线要从那一个口里出来?
