当前位置:网站首页>相机标定(2): 单目相机标定总结
相机标定(2): 单目相机标定总结
2022-07-07 09:41:00 【@BangBang】
1. 坐标系变换回顾
- 首先世界坐标系通过旋转、平移矩阵变换为相机坐标系
- 相机坐标系通过相似三角形(小孔成像原理),将相机坐标系转换为图像坐标系,这里利用的其实就是相机的焦距。
- 最好利用相机内参,将图像坐标系转换为像素坐标系。
相机标定
相机标定的目的是为了获得相机的内外参以及畸变参数。
相机标定的流程
- 1.打印标定板
- 2.从不同角度对标定板进行拍摄
- 3.用opencv接口检测标定板中的特征点(一般用的是方格,检测其角点)
- 4.求理想无畸变情况下的内外参
- 5.利用极大似然估计来迭代优化精度(用张正友标定法去求解内外参,其实是极大似然估计迭代求解的一个初始值,给定了初始求解参数,为了获取更精确的内外参需要用迭代法进行优化)
- 6.利用最小二乘法求解径向畸变参数
- 7.综合内外参、畸变参数,使用极大似然法,提升估计精度
- 8 最好我们会计算得到相机的内外参和畸变系数
相机标定的trick
标定板图案
标定板图案我们一般用的是棋盘格,但我们其实不一定都要使用棋盘格,可以使用其他的图案。
- 可以使用
三维、二维,圆形,网格,随机图案
。(如果用黑白棋盘格的话,检测角点会比较好检测;如果用的是圆形,它会检测圆心。Opencv这两种接口都有提供) - 一般选择使用平面物体的多个视角,而不是构造三维物体。
棋盘格角点个数和参数个数
- 标定板的个数一般是越多越好,每张标定板的格子数多点。在不引入噪点的情况下
- 总参数个数:四个相机内参
($f_x,f_y,u_0,v_0$),
5个畸变参数(k1~k3,p1,p2)
,3个旋转参数(每个坐标轴一个参数,能确定旋转矩阵),3个平移参数。 - 假设棋盘格有N个角点,K个不同位置的图像
- K个棋盘格提供2NK个约束,每个角点两个约束
- 暂时忽略畸变参数:有
4
个内参,6
个外参(在不同位置拍摄不同的图,旋转平移矩阵是不一样的,外参不相同) - 能够求解参数的前提:
2NK(约束) >6K +4
,推出(N-3)*K>2
,方程个数大于参数才可以求解 - 单应性矩阵,
通过4个点可以唯一确定
,4个点便可以表达平面透视图,在4个方向伸展边 - 不管棋盘格有多少个点,实际有用的只有四个有效的角点信息
- K>1 ,至少需要拍摄两张棋盘格
- 考虑到噪声和数值稳定性,需要使用更大的棋盘格,采集更多的图像
- 为了更有效的效果,一般使用
10
张以上的,7*8
或更大的棋盘格。采集更多的图,对这些图进行筛选,选择更有效的图片,对于噪声比较大的图像可以去掉。
如何评价相机的标定效果
评估重投影误差:
没有相机真实参数的情况下,评估相机标定的效果
- 检测到的二维图像的角点,和真实世界的三维点的投影点之间的距离;
- 使用标定得到的相机内外参,将三维世界点投影到像素坐标系中的二维点
- 然后和算法检测到的二维图片的角点,计算均方误差RM
我们会拿相机拍摄一张棋盘格,拍摄棋盘格会得到一张二维图像,二维图像上可以使用opencv的特征点检测算法,可以检测出二维图像的角点坐标A;另外,拍摄棋盘格我们知道它在世界坐标系的坐标,然后用我们求解到的相机内外参以及畸变参数,带到坐标矩阵变换中,通过计算求得棋盘格角点的坐标B。然后求解A,B的均方误差RMS - 平均的投影误差小于一个像素是可以接受的
- 计算每张图的重投影误差,可以用来赛选去除误差较大的图片
外参可视化 - 以相机为中心点的标定板视图
- 以标定板为中心的相机视图,对外参进行可视化
- 相机固定,标定板移动,适合以相机为中心的视图
- 反之,适合使用标定为中心的视图
观察畸变校正后的图片
-观察畸变矫正后的棋盘格,弯曲的线是否变直,适用于畸变比较明显的情况
如何改善相机标定的效果
增加更多的图片
标定板覆盖完全的图像,尤其是图像边缘、角点处畸变比较大的地方
标定的图片需要足够的变化,不同角度,不同位置
移除图片,对于噪声比较大的图片
移除模糊的图片
移除标定板相对于相机的倾斜度大于45度
边栏推荐
- Multithreaded application (thread pool, singleton mode)
- After the uniapp jumps to the page in onlaunch, click the event failure solution
- 分布式数据库主从配置(MySQL)
- Table replication in PostgreSQL
- Blog moved to Zhihu
- [system design] index monitoring and alarm system
- Leetcode - interview question 17.24 maximum submatrix
- 正在運行的Kubernetes集群想要調整Pod的網段地址
- 深度学习秋招面试题集锦(一)
- There are so many factors that imprison you
猜你喜欢
Onedns helps college industry network security
【系统设计】指标监控和告警系统
Socket socket programming
Half of the people don't know the difference between for and foreach???
关于测试人生的一站式发展建议
The annual salary of general test is 15W, and the annual salary of test and development is 30w+. What is the difference between the two?
Le Cluster kubernets en cours d'exécution veut ajuster l'adresse du segment réseau du pod
学习笔记|数据小白使用DataEase制作数据大屏
.NET MAUI 性能提升
90后,辞职创业,说要卷死云数据库
随机推荐
面试被问到了解哪些开发模型?看这一篇就够了
R语言使用quantile函数计算评分值的分位数(20%、40%、60%、80%)、使用逻辑操作符将对应的分位区间(quantile)编码为分类值生成新的字段、strsplit函数将学生的名和姓拆分
STM32入门开发 编写DS18B20温度传感器驱动(读取环境温度、支持级联)
R Language Using Image of magick package Mosaic Function and Image La fonction flatten empile plusieurs images ensemble pour former des couches empilées sur chaque autre
【时间格式工具函数的封装】
The running kubernetes cluster wants to adjust the network segment address of pod
oracle常见锁表处理方式
关于测试人生的一站式发展建议
vim 的各种用法,很实用哦,都是本人是在工作中学习和总结的
Process control (creation, termination, waiting, program replacement)
MPX plug-in
Talk about SOC startup (x) kernel startup pilot knowledge
Table replication in PostgreSQL
禁锢自己的因素,原来有这么多
[encapsulation of time format tool functions]
毕业季|与青春作伴,一起向未来!
竟然有一半的人不知道 for 与 foreach 的区别???
解决VSCode只能开两个标签页的问题
About the application of writing shell script JSON in JMeter
Case study of Jinshan API translation function based on retrofit framework