发布网友 发布时间:2024-10-22 09:22
共1个回答
热心网友 时间:2024-10-25 14:20
本文主要介绍相机标定的原理、过程、影响标定精度的因素以及标定时的注意事项。
一. 为什么要相机标定
用生活中的例子类比。你对眼睛近视有了解吗?晶状体的改变会导致看物体不清晰,需要校准后得到眼镜店的专业设备来进行“标定”,以确定需要多少度数的眼镜,标定后的物体是什么样的,我们看到的就是什么样的。同样,相机标定是因为镜头和安装等原因导致真实的物体与拍摄的不一致,所以需要标定。
二. 相机标定方法分类
目前相机标定方法主要分为三类:
表1 相机标定方法
本文主要对传统相机标定方法,以张正友标定方法来详细推导并讲解。
三. 张正友标定法的推导
本文以针孔相机为前提,使用一个平面棋盘格/圆形板/Apritag来标定相机。
3.1 参数的初步估计
记空间中一个3D点[公式],对应在相机像素平面的投影为[公式]。记[公式]为[公式]的齐次坐标,[公式]为[公式]的齐次坐标。假设相机内参为[公式],相机外参为[公式],其中:
[公式]
则有:
[公式]
所以有:
[公式][公式]
3.1.1 相机内参估计
根据[公式]以及图像中3D点及对应的投影点便可计算出[公式](展开后根据等式,转换为矩阵乘以把[公式]对应的向量关系,形成超定方程,使用最小二乘来求解)。
[公式]
所以相机内参就估计出来。
3.1.2 相机外参估计
相机内参[公式]已知,根据[公式]便可求出相机外参。
[公式]
由于噪音的存在,此处求得的[公式]不一定是正交的,不过此处不用管,这里仅仅是粗略估计。(我的想法:等后面精调完再处理,以保单位正交)
3.1.3 相机畸变系数估计
在此之前都没有考虑相机的畸变。但相机会由于透镜形状而产生径向畸变,会由于安装过程中透镜和成像平面没有严格平行而产生切向畸变。其中径向畸变在畸变中占主导地位,切向畸变的影响较小(论文中是这么说。具体原因,我猜测,安装上的误差相对透镜工艺的把控,相对而言,安装的可控性比透镜的工艺更容易把控,所以畸变中,径向畸变占主导地位)。对于张正友标定法,只考虑了径向畸变。回顾畸变模型式子:
[公式]表示相机坐标系下3D点对应在归一化平面中的坐标值(注:是不含有畸变的),[公式]是畸变参数,[公式]。
在张正友标定法中,只考虑了径向畸变,且只考虑[公式]这两项,因为认为[公式]影响很小(类比下泰勒,越高阶,影响越小)。所以有:
[公式]
记[公式]为像素平面的理想点(无畸变的),[公式]为真实投影到像素平面的点(有畸变的)。所以就有:
[公式]
所以有:
[公式]
由于噪音的存在(10)中[公式]不一定可逆,此时可使[公式],用最小二乘的方式求解,至此所有参数均以估计出。但这些参数并不准确,需要精调。
3.2 细调相机参数
根据模型预测的投影与真实的投影构建误差函数,假设有[公式]张图,每张图提取[公式]个点对的投影,记真实的投影为[公式]则有投影误差模型为:
[公式]
在此,投影误差模型已经构建,只需要最小化误差,求解出的参数就较准确。在上文中也提到过,求解得到的R并不一定满足旋转矩阵的性质,此处使用使用[公式]分解[公式],使得[公式],取[公式]及可保障满足旋转矩阵的性质。为啥?,理由如下: 假设[公式]等于最小化[公式]后的[公式],要优化R,则需满足:
[公式]
3.3 标定流程
根据上述的标定过程,总结如下:
3.4 退化问题
3.4.1 纯旋转
根据旋转矩阵的单位正交性,由[公式]可得[公式],使用右上标[公式]分别表示第1张图和第二张图对应的[公式],则[公式],结合[公式]可得:
[公式]
当只有纯旋转时,假设绕[公式]轴,相对于上一个位姿的旋转角度为[公式],则(下标表示第几张图):
[公式][公式]
结合[公式]的约束,由于第二张图的[公式]与第一张中的线性相关,所以约束只有其中一张有用,这样会导致无法求解参数。
3.4.2 纯平移
由[公式]和[公式]可知,当只有纯旋转时,且平移量不知道时,参数无法求解。若平移的方向及距离知道,还是可以求解得到参数的。根据旋转矩阵的单位正交性,由[公式]可得[公式],使用右上标[公式]表示第[公式]张图对应的[公式],则[公式],结合[公式]可得([公式]的下标表示第几张图):
[公式]
当只有纯平移时,有:
[公式]
在已知平移方向及距离的时候,可以通过此建立平移误差的模型,并将模型转换为矩阵乘以待求参数向量的形式,通过最小二乘求解参数。
3.5 建议四. 思考五. 标定工具
目前,我已知的可以借助Matlab,kalibr,和opencv径向标定。有说Matlab标定的精度比opencv的高,因为Matlab使用的LM优化算法,opencv使用的是梯度下降算法,且特征点查找的方式不一致(2014年的回答,采用的各工具版本未写明,现在是否还是如此,未知,目前我也没做过对比和深入研究,仅做一个引发思考的点)。请参考: Matlab与opencv标定方法的不同 opencv的标定请参考: opencv标定相机 kalibr的标定请参考: kalibr标定相机 (需要用到ROS) MATLAB的标定参考: 相机标定,在该页面下面有个例子: 例子:使用Apritag标定相机
热心网友 时间:2024-10-25 14:21
本文主要介绍相机标定的原理、过程、影响标定精度的因素以及标定时的注意事项。
一. 为什么要相机标定
用生活中的例子类比。你对眼睛近视有了解吗?晶状体的改变会导致看物体不清晰,需要校准后得到眼镜店的专业设备来进行“标定”,以确定需要多少度数的眼镜,标定后的物体是什么样的,我们看到的就是什么样的。同样,相机标定是因为镜头和安装等原因导致真实的物体与拍摄的不一致,所以需要标定。
二. 相机标定方法分类
目前相机标定方法主要分为三类:
表1 相机标定方法
本文主要对传统相机标定方法,以张正友标定方法来详细推导并讲解。
三. 张正友标定法的推导
本文以针孔相机为前提,使用一个平面棋盘格/圆形板/Apritag来标定相机。
3.1 参数的初步估计
记空间中一个3D点[公式],对应在相机像素平面的投影为[公式]。记[公式]为[公式]的齐次坐标,[公式]为[公式]的齐次坐标。假设相机内参为[公式],相机外参为[公式],其中:
[公式]
则有:
[公式]
所以有:
[公式][公式]
3.1.1 相机内参估计
根据[公式]以及图像中3D点及对应的投影点便可计算出[公式](展开后根据等式,转换为矩阵乘以把[公式]对应的向量关系,形成超定方程,使用最小二乘来求解)。
[公式]
所以相机内参就估计出来。
3.1.2 相机外参估计
相机内参[公式]已知,根据[公式]便可求出相机外参。
[公式]
由于噪音的存在,此处求得的[公式]不一定是正交的,不过此处不用管,这里仅仅是粗略估计。(我的想法:等后面精调完再处理,以保单位正交)
3.1.3 相机畸变系数估计
在此之前都没有考虑相机的畸变。但相机会由于透镜形状而产生径向畸变,会由于安装过程中透镜和成像平面没有严格平行而产生切向畸变。其中径向畸变在畸变中占主导地位,切向畸变的影响较小(论文中是这么说。具体原因,我猜测,安装上的误差相对透镜工艺的把控,相对而言,安装的可控性比透镜的工艺更容易把控,所以畸变中,径向畸变占主导地位)。对于张正友标定法,只考虑了径向畸变。回顾畸变模型式子:
[公式]表示相机坐标系下3D点对应在归一化平面中的坐标值(注:是不含有畸变的),[公式]是畸变参数,[公式]。
在张正友标定法中,只考虑了径向畸变,且只考虑[公式]这两项,因为认为[公式]影响很小(类比下泰勒,越高阶,影响越小)。所以有:
[公式]
记[公式]为像素平面的理想点(无畸变的),[公式]为真实投影到像素平面的点(有畸变的)。所以就有:
[公式]
所以有:
[公式]
由于噪音的存在(10)中[公式]不一定可逆,此时可使[公式],用最小二乘的方式求解,至此所有参数均以估计出。但这些参数并不准确,需要精调。
3.2 细调相机参数
根据模型预测的投影与真实的投影构建误差函数,假设有[公式]张图,每张图提取[公式]个点对的投影,记真实的投影为[公式]则有投影误差模型为:
[公式]
在此,投影误差模型已经构建,只需要最小化误差,求解出的参数就较准确。在上文中也提到过,求解得到的R并不一定满足旋转矩阵的性质,此处使用使用[公式]分解[公式],使得[公式],取[公式]及可保障满足旋转矩阵的性质。为啥?,理由如下: 假设[公式]等于最小化[公式]后的[公式],要优化R,则需满足:
[公式]
3.3 标定流程
根据上述的标定过程,总结如下:
3.4 退化问题
3.4.1 纯旋转
根据旋转矩阵的单位正交性,由[公式]可得[公式],使用右上标[公式]分别表示第1张图和第二张图对应的[公式],则[公式],结合[公式]可得:
[公式]
当只有纯旋转时,假设绕[公式]轴,相对于上一个位姿的旋转角度为[公式],则(下标表示第几张图):
[公式][公式]
结合[公式]的约束,由于第二张图的[公式]与第一张中的线性相关,所以约束只有其中一张有用,这样会导致无法求解参数。
3.4.2 纯平移
由[公式]和[公式]可知,当只有纯旋转时,且平移量不知道时,参数无法求解。若平移的方向及距离知道,还是可以求解得到参数的。根据旋转矩阵的单位正交性,由[公式]可得[公式],使用右上标[公式]表示第[公式]张图对应的[公式],则[公式],结合[公式]可得([公式]的下标表示第几张图):
[公式]
当只有纯平移时,有:
[公式]
在已知平移方向及距离的时候,可以通过此建立平移误差的模型,并将模型转换为矩阵乘以待求参数向量的形式,通过最小二乘求解参数。
3.5 建议四. 思考五. 标定工具
目前,我已知的可以借助Matlab,kalibr,和opencv径向标定。有说Matlab标定的精度比opencv的高,因为Matlab使用的LM优化算法,opencv使用的是梯度下降算法,且特征点查找的方式不一致(2014年的回答,采用的各工具版本未写明,现在是否还是如此,未知,目前我也没做过对比和深入研究,仅做一个引发思考的点)。请参考: Matlab与opencv标定方法的不同 opencv的标定请参考: opencv标定相机 kalibr的标定请参考: kalibr标定相机 (需要用到ROS) MATLAB的标定参考: 相机标定,在该页面下面有个例子: 例子:使用Apritag标定相机