张正友相机标定算法解读
2016-05-21 13:33
495 查看
张正友标定算法解读
一直以来想写篇相机标定方面的东西,最近组会上也要讲标定方面东西,所以顺便写了。无论是OpenCV还是matlab标定箱,都是以张正友棋盘标定算法为核心实现的,这篇PAMI的文章《A Flexible New Technique for Camera Calibration》影响力极大,张正友是浙江大学的机械系出身,貌似现在是微软的终身教授了。我就简单的介绍下算法的核心原理,公式的推理可能有点多。
一 基本问题描述:空间平面的三维点与相机平面二维点的映射。
假设空间平面中三维点:
(齐次坐标,世界坐标系)。
相机平面二维点:
(齐次坐标,相机坐标系)。
那么空间中的点是如何映射到相机平面上去呢?我们用一个等式来表示两者之间关系:
(1)
注:A为相机内参矩阵,R,t分别为旋转和平移矩阵,s为一个放缩因子标量。
我们把等式(1)再简化下:
(2)
因为张正友算法选取的是平面标定,所以令z=0,所以平移向量只有r1,r2即可。H就是我们常说的单应性矩阵,在这里描述的是空间中平面三维点和相机平面二维点之间的关系。因为相机平面中点的坐标可以通过图像处理的方式(哈里斯角点,再基于梯度搜索的方式精确控制点位置)获取,而空间平面中三维点可以通过事先做好的棋盘获取。所以也就是说每张图片都可以计算出一个H矩阵。
二 内参限制
我们把H矩阵(3*3)写成3个列向量形式,那么我们把H矩阵又可写成:
(3)
注:lamda是个放缩因子标量,也是s的倒数。
那么现在我们要用一个关键性的条件:r1和r2标准正交。
正交:
(4)
单位向量(模相等):
(5)
这个两个等式是非常优美的,因为它完美的与绝对二次曲线理论联系起来了,这里就不展开了。
三 相机内参的求解
我们令:
(6)
我们可知B矩阵是个对称矩阵,所以可以写成一个6维向量形式:
(7)
我们把H矩阵的列向量形式为:
(8)
那么根据等式(8)我们把等式(4)改写成:
(9)
(10)
最后根据内参数限制条件(等式(4)(5)):
(11)
即,
(12)
V矩阵是2*6矩阵,也就是说每张照片可建立起两个方程组,6个未知数。根据线性代数知识可知,解6个未知数需至少6个方程组,所以也就是说我们至少需要三张照片就求解未知数。b矩阵的解出,相机内参矩阵A也就求解出,从而每张图像的R,t也就根据等式(1)迎刃而解。
四 参数优化
因为初始的参数已经求解,所以我们将每张图像的控制点根据求解的参数重投影回三维空间,最小化与真实值的差异,其实就是建立非线性最小化模型:
(13)
这里用的是Levenberg-Marquardt迭代算法。
至此,整个流程走完,至于相机畸变系数的求解本文也不具体展开了。
一直以来想写篇相机标定方面的东西,最近组会上也要讲标定方面东西,所以顺便写了。无论是OpenCV还是matlab标定箱,都是以张正友棋盘标定算法为核心实现的,这篇PAMI的文章《A Flexible New Technique for Camera Calibration》影响力极大,张正友是浙江大学的机械系出身,貌似现在是微软的终身教授了。我就简单的介绍下算法的核心原理,公式的推理可能有点多。
一 基本问题描述:空间平面的三维点与相机平面二维点的映射。
假设空间平面中三维点:
(齐次坐标,世界坐标系)。
相机平面二维点:
(齐次坐标,相机坐标系)。
那么空间中的点是如何映射到相机平面上去呢?我们用一个等式来表示两者之间关系:
(1)
注:A为相机内参矩阵,R,t分别为旋转和平移矩阵,s为一个放缩因子标量。
我们把等式(1)再简化下:
(2)
因为张正友算法选取的是平面标定,所以令z=0,所以平移向量只有r1,r2即可。H就是我们常说的单应性矩阵,在这里描述的是空间中平面三维点和相机平面二维点之间的关系。因为相机平面中点的坐标可以通过图像处理的方式(哈里斯角点,再基于梯度搜索的方式精确控制点位置)获取,而空间平面中三维点可以通过事先做好的棋盘获取。所以也就是说每张图片都可以计算出一个H矩阵。
二 内参限制
我们把H矩阵(3*3)写成3个列向量形式,那么我们把H矩阵又可写成:
(3)
注:lamda是个放缩因子标量,也是s的倒数。
那么现在我们要用一个关键性的条件:r1和r2标准正交。
正交:
(4)
单位向量(模相等):
(5)
这个两个等式是非常优美的,因为它完美的与绝对二次曲线理论联系起来了,这里就不展开了。
三 相机内参的求解
我们令:
(6)
我们可知B矩阵是个对称矩阵,所以可以写成一个6维向量形式:
(7)
我们把H矩阵的列向量形式为:
(8)
那么根据等式(8)我们把等式(4)改写成:
(9)
(10)
最后根据内参数限制条件(等式(4)(5)):
(11)
即,
(12)
V矩阵是2*6矩阵,也就是说每张照片可建立起两个方程组,6个未知数。根据线性代数知识可知,解6个未知数需至少6个方程组,所以也就是说我们至少需要三张照片就求解未知数。b矩阵的解出,相机内参矩阵A也就求解出,从而每张图像的R,t也就根据等式(1)迎刃而解。
四 参数优化
因为初始的参数已经求解,所以我们将每张图像的控制点根据求解的参数重投影回三维空间,最小化与真实值的差异,其实就是建立非线性最小化模型:
(13)
这里用的是Levenberg-Marquardt迭代算法。
至此,整个流程走完,至于相机畸变系数的求解本文也不具体展开了。
相关文章推荐
- Linux下计划任务 crontab
- cocos2d-x 的安装以及hello world
- AndroidStudio Failed to complete Gradle execution
- 视频图像处理基础知识4(视频分辨率参考 行频 隔行扫描 逐行扫描)
- Time类中的运算符重载(3)-前置++,后置++
- Zookeeper四字命令
- [bzoj3307]雨天的尾巴
- jQuery DataTables插件自定义Ajax分页实例解析
- Python Tricks(九)—— 递归遍历目录下所有文件
- 基础命令 用户管理相关内容学习
- 循环赛日程表
- poj-1321-棋盘问题
- 人生就像一条加速奔向死亡的贪吃蛇【winform版】
- Java线程创建的三种方式
- 配置nginx.conf将URL从目录形式转为参数形式
- Hibernate增删改查一些方法的区别
- MongoDB相关资料收集
- AndroidEventBus使用----基本操作(1)
- yii2分页的使用及其扩展
- 使用PR_GET_NO_NEW_PRIVS 避免安全漏洞