最详细、最完整的相机标定讲解

相机标定详解

最近做项目要用到标定,因为是小白,很多东西都不懂,于是查了一堆的博客,但没有一个博客能让我完全能看明白整个过程,绝大多数都讲的不全面,因此自己总结了一篇博客,给自己理一下思路,也能够帮助大家。(张正友标定的详细求解还未完全搞明白,后面再加)

参考博客: 
相机标定(Camera calibration)原理、步骤 
(http://blog.csdn.net/lql0716/article/details/71973318?locationNum=8&fps=1)

相机标定内容详解 (转载自祥的博客) 
(http://blog.csdn.net/humanking7/article/details/44756073)

张正友标定介绍 
(http://blog.csdn.net/heroacool/article/details/50286677)

[图像]摄像机标定(2) 张正友标定推导详解 
(http://blog.csdn.net/humanking7/article/details/44756235)

MATLAB–相机标定教程 
(http://blog.csdn.net/heroacool/article/details/51023921)

在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数(内参、外参、畸变参数)的过程就称之为相机标定(或摄像机标定)。无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在。 
畸变(distortion)是对直线投影(rectilinear projection)的一种偏移。简单来说直线投影是场景内的一条直线投影到图片上也保持为一条直线。畸变简单来说就是一条直线投影到图片上不能保持为一条直线了,这是一种光学畸变(optical aberration),可能由于摄像机镜头的原因。

坐标转换基础

在视觉测量中,需要进行的一个重要预备工作是定义四个坐标系的意义,即 摄像机坐标系 、 图像物理坐标系、 像素坐标系 和 世界坐标系(参考坐标系) 。

一、图像坐标系(x,y)至像素坐标系(u,v)

1.两坐标轴互相垂直

这里写图片描述

此时有

这里写图片描述

2.一般情况,两轴不互相垂直(图像畸变)

这里写图片描述

此时有

这里写图片描述

写成矩阵形式为:

这里写图片描述

二、相机坐标系(Xc,Yc,Zc)至图像坐标系(x,y)

这里写图片描述

(根据小孔成像原理,图像坐标系应在相机坐标系的另一边,为倒立反向成像,但为方便理解和计算,故投影至同侧。)

根据三角形相似性原理得:

这里写图片描述

三、世界坐标系(Xw,Yw,Zw)至相机坐标系(Xc,Yc,Zc)

这里写图片描述

四、合并公式

这里写图片描述

这里写图片描述

R、T矩阵为相机的外参矩阵。

畸变

畸变一般可以分为:径向畸变、切向畸变

径向畸变来自于透镜形状。 
切向畸变来自于整个摄像机的组装过程。

畸变还有其他类型的畸变,但是没有径向畸变、切向畸变显著,所以忽略不计。

这里写图片描述

径向畸变(桶形畸变和枕形畸变):

实际摄像机的透镜总是在成像仪的边缘产生显著的畸变,这种现象来源于“筒形”或“鱼眼”的影响。 
如下图,光线在原理透镜中心的地方比靠近中心的地方更加弯曲。对于常用的普通透镜来说,这种现象更加严重。筒形畸变在便宜的网络摄像机中非常厉害,但在高端摄像机中不明显,因为这些透镜系统做了很多消除径向畸变的工作。 
这里写图片描述

对于径向畸变,成像仪中心(光学中心)的畸变为0,随着向边缘移动,畸变越来越严重。 
对于径向畸变可以通过下面的泰勒级数展开式进行校正: 
这里写图片描述 
这里的x、y是图像中的畸变后的位置坐标,通过校正得到真实坐标。r是该点距成像中心的距离。

切向畸变(薄透镜畸变和离心畸变):

切向畸变是由于透镜制造上的缺陷使得透镜本身与图像平面不平行而产生的。

这里写图片描述

切向畸变可以通过如下公式来矫正: 
这里写图片描述 
这里的x、y是图像中的畸变后的位置坐标,通过校正得到真实坐标。r是该点距成像中心的距离。

opencv畸变模型

径向畸变模型:

这里写图片描述

切向畸变模型:

这里写图片描述

这里写图片描述

可得:

这里写图片描述

由公式可得畸变有k1,k2,k3,p1,p2五个参数,对于质量比较好的相机来说,切向畸变很小,可忽略,径向畸变系数k3也可忽略,只计算k1,k2两个参数。张正友标定中就默认为p1,p2为0。

张正学标定中的畸变模型:

这里写图片描述

标定方法

1、传统相机标定

最简单的相机标定为线性标定,即不考虑相机的畸变而只考虑空间坐标转换。 
每个坐标点有X,Y两个变量,可列两个方程,相机内参有5个未知数,外参平移和旋转各3个,共有11个变量,因此至少需要6个特征点来求解。

2、非线性标定

当镜头畸变明显时必须考虑畸变,一般较为便宜的网络摄像头畸变特别大,而价格较贵的工业摄像头则畸变很小,因为其中已经嵌入了许多消除畸变的程序。这时线性模型转化为非线性模型,需要通过非线性标定方法求解。有最速下降法,遗传算法,高斯牛顿法和神经网络算法等。

3、张正友标定介绍

(张正友标定只考虑了径向畸变,没有考虑切向畸变)

由上面的坐标转换可得:

这里写图片描述

这里写图片描述

我们把世界坐标系放置在标定板平面上,令Z=0,这时有:

这里写图片描述 
这里写图片描述

H为3X3矩阵,并且有一个元素作为齐次坐标,则有8个未知元素,一组坐标对应两个方程,则至少需要四组对应的点即可算出单应性矩阵H。

这里写图片描述

旋转矩阵为正交矩阵,因此有以下性质:

这里写图片描述

代入可得

这里写图片描述

由此可求出单应性矩阵A,因A有5个元素,则至少需要三个单应性矩阵方能求解,那么就需要三张不同的标定图片,这就是为什么标定需要用至少3张以上的图片的原因之一(我还不是完全确定是这样)

3.2.3 标定

相机标定步骤:

1、打印一张棋盘格,把它贴在一个平面上,作为标定物。 
2、通过调整标定物或摄像机的方向,为标定物拍摄一些不同方向的照片。 
3、从照片中提取棋盘格角点。 
4、估算理想无畸变的情况下,五个内参和六个外参。 
5、应用最小二乘法估算实际存在径向畸变下的畸变系数。 
6、极大似然法,优化估计,提升估计精度。

Matlab工具箱标定:

1、应用程序中找到Camera Calibration

这里写图片描述

2、添加标定板拍摄图片(按Ctrl可一次添加多张)

这里写图片描述

3、输入棋盘格每格的尺寸大小

这里写图片描述

4、显示已检测出的棋盘格,点击Calibration,开始标定。

这里写图片描述

5、得到标定结果(平均误差小于0.5即可认为结果可靠,这个地方我还不是很清楚)

这里写图片描述

6、可查看标定结果和程序

这里写图片描述

这里写图片描述

这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时间日志和缺陷日志

项目计划总结: 日期&&任务 听课 编写程序 阅读相关书籍 网上查找资料 日总计 周一 2 2 1 1 6 周二 2 1 3 周三 1 2 2 5 周四 2 2 1 5 周五 4 1 1 6 周六 3 1 1 4 周日 4 2 2 周总计 4 …

卷积与反卷积动图

各种卷积与反卷积动态图 反卷积: 详细文字链接:https://www.zhihu.com/question/43609045/answer/132235276(该链接中并没有下面的动态图) Deconvolution大致可以分为以下几个方面:(1)unsupervised learning,其实就…

ASP.NET-权限管理五张表

ASP.NET 权限管理五张表权限管理的表(5张表)每个表里面必有的一些信息序号名称 字段 类型 主键默认值是否为空备注1 用户ID ID INT 是 null 否用户ID2用户名称UserNamevarchar(100)否null否用户名称3用户密码UserPasswordvarchar(20)否null否用…

神经网络CNN解释

from:https://blog.csdn.net/ruiyiin/article/details/77113973 这篇文章原地址为An Intuitive Explanation of Convolutional Neural Networks,卷积神经网络的讲解非常通俗易懂。 什么是卷积神经网络?为什么它们很重要? 卷积神经…

线条的属性

1.lineCap"butt“ /"round" /"square" 只能用于线段的结尾处 不能用于线段的衔接处 2.lineJoin:线条与线条相交时的形态 miter(default)/ bevel (斜接)/round(圆接) 1.后绘制的图形,如果与前绘制的图形区…

pcl里面使用KdTree来搜索

from:https://blog.csdn.net/qq_25491201/article/details/51135054 下面这个教程我们将学会怎么用KdTree找一个特殊点附近的K个最近邻,然后我们也将复习怎么通过一个特殊的半径来找里面所有的近邻。 一个k-d树,或者k维的树是一个计算机科学里面的数据…

Linux英文全称

su:Swith user 切换用户,切换到root用户cat: Concatenate 串联uname: Unix name 系统名称df: Disk free 空余硬盘du: Disk usage 硬盘使用率chown: Change owner 改变所有者chgrp: Change group 改变用户组ps:Process Status 进程状态ta…

caffe caffe.cpp 程序入口分析

from:https://blog.csdn.net/u014114990/article/details/47747025 caffe.cpp 程序入口分析, (1)main()函数中,输入的train,test,device_query,time。 通过下面两行进入程序。 …

php文件加密

1.在线加密 网址:http://www.phpjm.net/encode.html 本人测试过还可以,就是纯加密,没有解密。 转载于:https://www.cnblogs.com/wuheng1991/p/5332617.html

树莓派3 编译驱动

分为本地编译和交叉编译,主要是Makefile的写法: 本地编译: obj-m : bcm2835-i2s.o KDIR : /lib/modules/$(shell uname -r)/build PWD : $(shell pwd) all:make -C $(KDIR) M$(PWD) modules clean:rm *.o *.ko *.mod.c modules.order Module.…

caffe common 程序分析 类中定义类

caffe中 有 common.hpp 和common.cpp // The main singleton of Caffe class and encapsulates the boost and CUDA random number // generation function, providing a unified interface. caffe的singleton 类, 封装boost和cuda等操作。 提供一个统一的接口&am…

相机标定究竟在标定什么?

https://mp.weixin.qq.com/s/sWpVgwXmPvIEbObXvo1HRg

SpringMVC+Shiro权限管理

SpringMVCShiro权限管理 什么是权限呢?举个简单的例子: 我有一个论坛,注册的用户分为normal用户,manager用户。对论坛的帖子的操作有这些:添加,删除,更新,查看,回复我们规…

Caffe源码解析1:Blob

from:https://www.cnblogs.com/louyihang-loves-baiyan/p/5149628.html 转载请注明出处,楼燚(y)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ 首先看到的是Blob这个类,Blob是作为Caffe中数据流通的一个基本类,网络…

学后感

今天上了构建之法,我加深了对软件工程的了解,也明白了单元测试和回归测试对软件开发的重要性,然而在软件开发的过程中, 一个团队是需要一定的流程来管理开发活动,每个工程师在软件生命周期所做的工作也应该有一个流程&…

Caffe源码解析2:SycedMem

from:https://www.cnblogs.com/louyihang-loves-baiyan/p/5150554.html 转载请注明出处,楼燚(y)航的blog,http://www.cnblogs.com/louyihang loves baiyan/ 看到SyncedMem就知道,这是在做内存同步的操作。这类个类的代码比较少,…

REST学习

RPC架构与REST架构 RPC:RPC将服务器看作一些列动作的集合(需要做某件事) REST:将服务器看作分布式对象集合,客户端通过调用这些对象上的方法来执行特定的任务,组件交互的可伸缩性、接口的通用性、组件的独立部署、以及用来减少交互…

HI3559A和AI深度学习框架caffe

from:http://blog.sina.com.cn/s/blog_156e567660102ygdf.html 1、HI3559A支持深度学习框架caffe。其中的NNIE神经网络加速单元是主要的属性。 2、caffe是一种快速深度学习框架和TensorFlow一样是一组标准深度学习开源框架。 3、对应想尝试AI深度学习的朋友可以按照网上的流…

UValive4195 Heroes of Money and Magic

斜率优化 想骂人了,马格吉最后调了半小时 TMD造数据的人是SB吧? 我写 while(scanf("%d%d",&n,&m)!EOF&&n) 然后就TMD无限WA...WA...WA... 尼玛 改成while(scanf("%d%d",&n,&m),n) 就过了,就过了…

Google Protocol Buffer 的使用和原理

from: https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/index.html 简介 什么是 Google Protocol Buffer? 假如您在网上搜索,应该会得到类似这样的文字介绍: Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言…