【视频开发】【计算机视觉】相机标定(Camera calibration)原理、步骤
相机标定(Camera calibration)原理、步骤
author@jason_ql(lql0716)
http://blog.csdn.net/lql0716
在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在。
常用术语
内参矩阵: Intrinsic Matrix
焦距: Focal Length
主点: Principal Point
径向畸变: Radial Distortion
切向畸变: Tangential Distortion
旋转矩阵: Rotation Matrices
平移向量: Translation Vectors
平均重投影误差: Mean Reprojection Error
重投影误差: Reprojection Errors
重投影点: Reprojected Points
1、坐标系的转换
1.1 世界坐标系
世界坐标系(world coordinate)(xw,yw,zw),也称为测量坐标系,是一个三维直角坐标系,以其为基准可以描述相机和待测物体的空间位置。世界坐标系的位置可以根据实际情况自由确定。
1.2 相机坐标系
相机坐标系(camera coordinate)(xc,yc,zc),也是一个三维直角坐标系,原点位于镜头光心处,x、y轴分别与相面的两边平行,z轴为镜头光轴,与像平面垂直。
1.3 世界坐标系转换为相机坐标系
其中R为3*3的旋转矩阵,t为3*1的平移矢量,(xc,yc,zc,1)T为相机坐标系的齐次坐标,(xw,yw,zw,1)T为世界坐标系的齐次坐标。
1.4 像素坐标系、图像坐标系
图1:
像素坐标系(pixel coordinate)
如图1,像素坐标系uov是一个二维直角坐标系,反映了相机CCD/CMOS芯片中像素的排列情况。原点o位于图像的左上角,u轴、v轴分别于像面的两边平行。像素坐标系中坐标轴的单位是像素(整数)
。像素坐标系不利于坐标变换,因此需要建立图像坐标系XOY,
其坐标轴的单位通常为毫米(mm)
,原点是相机光轴与相面的交点(称为主点),即图像的中心点,X轴、Y轴分别与u轴、v轴平行。故两个坐标系实际是平移关系,即可以通过平移就可得到。图像坐标系转换为像素坐标系
其中,dX、dY分别为像素在X、Y轴方向上的物理尺寸,u0,v0为主点(图像原点)坐标。
1.5 针孔成像原理
图2:
如图,空间任意一点P与其图像点p之间的关系,P与相机光心o的连线为oP,oP与像面的交点p即为空间点P在图像平面上的投影。
该过程为透视投影,如下矩阵表示:
其中,s为比例因子(s不为0),f为有效焦距(光心到图像平面的距离),(x,y,z,1)T是空间点P在相机坐标系oxyz中的齐次坐标,(X,Y,1)T是像点p在图像坐标系OXY中的齐次坐标。
1.6 世界坐标系转换为像素坐标系
其中,αx=f/dX、αy=f/dY,称为u、v轴的尺度因子,M1称为相机的内部参数矩阵,M2称为相机的外部参数矩阵,M称为投影矩阵。
2 相机内参与畸变参数
2.1 相机内参
- 参看1.6节所述
2.2 畸变参数
畸变参数(distortion parameters)
畸变(distortion)
是对直线投影(rectilinear projection)的一种偏移。简单来说直线投影是场景内的一条直线投影到图片上也保持为一条直线。
畸变简单来说就是一条直线投影到图片上不能保持为一条直线了,这是一种
光学畸变(optical aberration)
,可能由于摄像机镜头的原因。畸变一般可以分为:径向畸变、切向畸变
1、径向畸变来自于透镜形状
2、切向畸变来自于整个摄像机的组装过程畸变还有其他类型的畸变,但是没有径向畸变、切向畸变显著
畸变图示
径向畸变
实际摄像机的透镜总是在成像仪的边缘产生显著的畸变,这种现象来源于“筒形”或“鱼眼”的影响。
如下图,光线在原理透镜中心的地方比靠近中心的地方更加弯曲。对于常用的普通透镜来说,这种现象更加严重。筒形畸变在便宜的网络摄像机中非常厉害,但在高端摄像机中不明显,因为这些透镜系统做了很多消除径向畸变的工作。
对于径向畸变,成像仪中心(光学中心)的畸变为0,随着向边缘移动,畸变越来越严重。
径向畸变包括:枕形畸变、桶形畸变
切向畸变
切向畸变是由于透镜制造上的缺陷使得透镜本身与图像平面不平行而产生的。
切向畸变可分为:薄透镜畸变、离心畸变
切向畸变图示:
2.2.1 opencv中的畸变模型
- 径向畸变模型:
以下公式由泰勒展式得出,在opencv中K=1,r2=x2+y2, (x,y)为真实坐标(发生畸变),(x′,y′)为理想坐标。
- 切向畸变模型:
- 理想坐标(x′,y′)与真实坐标(x,y):
也即:
实际计算过程中,如果考虑太多高阶的畸变参数,会导致标定求解的不稳定。
2.2.2 张氏标定中的畸变模型
张正友的方法只考虑了径向畸变,没有考虑切向畸变
模型:
理想情况下(没有畸变)图片的像素坐标为:
(u,v)真实的像素坐标为:
(u¯,v¯)真实坐标与理想坐标的关系式(泰勒展开):
(x,y) and (x¯,y¯) are
the ideal (distortion-free) and real (distorted) normalized image coordinates.x¯=x+x[k1(x2+y2)+k2(x2+y2)2]
y¯=y+y[k1(x2+y2)+k2(x2+y2)2]其中k1,k2是径向畸变系数(coefficients
of the radial distortion)。像素坐标表示为:
u¯=u+(u−u0)[k1(x2+y2)+k2(x2+y2)2]v¯=v+(v−v0)[k1(x2+y2)+k2(x2+y2)2]即:
[(u−u0)(x2+y2)(v−v0)(x2+y2)(u−u0)(x2+y2)2(v−v0)(x2+y2)][k1k2]=[u¯−uv¯−v]
2.2.3 Tasi畸变模型
- Tasi畸变模型同张氏畸变模型类似,也只考虑了径向畸变
2.3 相机标定
- 相机标定步骤:
1、打印一张棋盘格,把它贴在一个平面上,作为标定物。
2、通过调整标定物或摄像机的方向,为标定物拍摄一些不同方向的照片。
3、从照片中提取棋盘格角点。
4、估算理想无畸变的情况下,五个内参和六个外参。
5、应用最小二乘法估算实际存在径向畸变下的畸变系数。
6、极大似然法,优化估计,提升估计精度。
3 Matlab相机标定
- 打开matlab,找到“Camera Calibrator”并打开
- 在新窗口中选择添加图片“Add Images”
- 添加图片之后,会有如下提示,设置棋盘格的实际大小之后,点击ok
- 点击“Calibrate”开始计算
- 点击“Export Camera Parameters”,输出到matlab命令窗口
- 导出的数据如下:
cameraParams =
cameraParameters (具有属性):
Camera Intrinsics
IntrinsicMatrix: [3x3 double]
FocalLength: [510.6720 511.9534]
PrincipalPoint: [332.3800 238.4849]
Skew: 0
Lens Distortion
RadialDistortion: [0.0618 -0.4877]
TangentialDistortion: [0 0]
Camera Extrinsics
RotationMatrices: [3x3x50 double]
TranslationVectors: [50x3 double]
Accuracy of Estimation
MeanReprojectionError: 0.1923
ReprojectionErrors: [77x2x50 double]
ReprojectedPoints: [77x2x50 double]
Calibration Settings
NumPatterns: 50
WorldPoints: [77x2 double]
WorldUnits: 'mm'
EstimateSkew: 0
NumRadialDistortionCoefficients: 2
EstimateTangentialDistortion: 0
estimationErrors =
cameraCalibrationErrors (具有属性):
IntrinsicsErrors: [1x1 intrinsicsEstimationErrors]
ExtrinsicsErrors: [1x1 extrinsicsEstimationErrors]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 在命令窗口输入以下命令即可获得内参矩阵和径向畸变:
>> cameraParams.IntrinsicMatrix
ans =
510.6720 0 0
0 511.9534 0
332.3800 238.4849 1.0000
>> cameraParams.RadialDistortion
ans =
0.0618 -0.4877
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
参考资料
相关文章
《学习opencv》
【视频开发】【计算机视觉】相机标定(Camera calibration)原理、步骤的更多相关文章
- 相机标定(Camera calibration)
简单介绍 摄像机标定(Camera calibration)简单来说是从世界坐标系换到图像坐标系的过程.也就是求终于的投影矩阵 P 的过程,以下相关的部分主要參考UIUC的计算机视觉的课件(网址Spr ...
- [zt]摄像机标定(Camera calibration)笔记
http://www.cnblogs.com/mfryf/archive/2012/03/31/2426324.html 一 作用建立3D到2D的映射关系,一旦标定后,对于一个摄像机内部参数K(光心焦 ...
- Android 音视频开发(四):使用 Camera API 采集视频数据
本文主要将的是:使用 Camera API 采集视频数据并保存到文件,分别使用 SurfaceView.TextureView 来预览 Camera 数据,取到 NV21 的数据回调. 注: 需要权限 ...
- Android IOS WebRTC 音视频开发总结(十三)-- ice原理
以前在做一个视频监控项目的时候,刚开始客户没提到要支持P2P,因为服务端是我们自己写的,为了便于处理一些逻辑,全部采用转发的方式,后来客户要求支持P2P,没办法了,后来自己部署了一个STUN服务器(不 ...
- 【视频开发】【计算机视觉】相机标定(Camera calibration)《二》
简介 摄像机标定(Camera calibration)简单来说是从世界坐标系换到图像坐标系的过程,也就是求最终的投影矩阵 P 的过程,下面相关的部分主要参考UIUC的计算机视觉的课件(网址Sprin ...
- Android 音视频开发学习思路
Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 初级入门篇: Android 音视频开发(一) ...
- WebRTC 音视频开发
WebRTC 音视频开发 webrtc Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译 ...
- Android 音视频开发(七): 音视频录制流程总结
在前面我们学习和使用了AudioRecord.AudioTrack.Camera.MediaExtractor.MediaMuxer API.MediaCodec. 学习和使用了上述的API之后,相信 ...
- 转:Android IOS WebRTC 音视频开发总结 (系列文章集合)
随笔分类 - webrtc Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译和整理的,译 ...
随机推荐
- JS提交表单页面不跳转、JS下载、动态创建from
JS下载 function downloadFile(id) { var url = "<%=request.getContextPath()%>/cer/downlo ...
- Android调用系统相机和相册并解决data为空,OOM,图片角度不对的问题
最近公司项目用到手机拍照的问题,好不容易在网上copy了一些代码,但是运行起来一大堆bug,先是三星手机上运行程序直接崩掉,debug了一下原来是onActivityResult中data返回为空,找 ...
- elasticsearch查询所有数据restful api以及java代码实现
原文:http://blog.java1234.com/blog/articles/366.html restful api实现如下: get http://192.168.1.111:9200/fi ...
- Asp.Net SignalR 使用记录 技术回炉重造-总纲 动态类型dynamic转换为特定类型T的方案 通过对象方法获取委托_C#反射获取委托_ .net core入门-跨域访问配置
Asp.Net SignalR 使用记录 工作上遇到一个推送消息的功能的实现.本着面向百度编程的思想.网上百度了一大堆.主要的实现方式是原生的WebSocket,和SignalR,再次写一个关于A ...
- angularjs中设置select的选中项
最近用angularjs比较多,里面有很多自己的方法,都不咋会用,这篇只是个笔记,防止自己忘记 <select style="width:100%" ng-model=&qu ...
- JS在HTML文档引入位置
我们今天来聊一聊关于JavaScript文件的引入位置的问题:大家在平时的Web开发中有没有想过这样一个问题,那就是我应该在文档的头部(也就是<head>标签内部里面)引入所需要的Java ...
- 使用WIFI网卡iw
上篇博客中,配置修改了内核,以支持所选择的USB网卡,本篇博客需要去编写一些应用程序,将wifi网卡使用起来. 1.1 概念:认证/加密认证:就是用来判断哪些用户可以使用这个无线网络加密:是指手机和A ...
- 小人大作战v0.02原型(单机)发布
运行环境,pc,windows 链接:https://pan.baidu.com/s/1X5XR0flRAVuinnydNyRNng 提取码:cp9q 复制这段内容后打开百度网盘手机App,操作更方便 ...
- discuz x3.2简化的搜索框代码
这是在做一个模板时改的,并不代表这是一个美化或者优化,只是特殊情况下的需要.只有一个搜索框,默认帖子搜索,无搜索按钮,输入内容直接回车搜索. <!--{if $_G['setting']['se ...
- robotframework连接mysql
1.安装mysql数据库,并启动,创建数据库test及user表(可以自定义) 2.配置robotframework环境加载DatabaseLibrary 3.安装pymysql,下载地址:https ...