C#下的摄像机标定
前言:计算机视觉的基本任务之一是从摄像机获取的图像信息出发计算三维空间中物体的几何信息,并由此重建和识别物体,而空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系是由摄像机成像的几何模型决定的,这些几何模型参数就是摄像机参数。在大多数条件下,这些参数必须通过实验与计算才能得到,这个过程称为摄像机标定。标定过程就是确定摄像机的几何和光学参数、摄像机相对于世界坐标系的方位。
内容:
1.假设摄像机所拍摄到的图像与三维空间中的物体之间存在以下一种简单的线性关系:[像]=M[物],这里,矩阵M可以看成是摄像机成像的几何模型。 M中的参数就是摄像机参数。通常参数分为摄像机的内参和外参。
2.摄像机的标定方法分为三类:传统摄像机标定方法、主动视觉摄像机标定方法、摄像机自标定方法。
传统的摄像机标定方法:特点:利用已知的景物结构信息,常用到标定块;优点:可以使用于任意的摄像机模型,标定精度高;不足:标定过程复杂,需要高精度的已知结构信息,在实际应用中很多情况下无法使用标定块。
主动视觉摄像机标定方法:特点:已知摄像机的某些运动信息;优点:通常可以线性求解,鲁棒性比较高;不足:不能用于摄像机运动未知和无法控制的场合。
摄像机自标定方法:特点:仅依靠多幅图像之间的对应关系进行标定;优点:仅需要建立图像之间的对应,灵活性强,潜在应用范围广;不足:非线性标定,鲁棒性不高。
3.摄像机成像模型:图像是空间物体通过成像系统在平面上的反映,即空间物体在像平面上的投影。图像上每一个像素点的灰度反映了空间物体表面某点的反射光的强度,而该点在图像上的位置则与空间物体表面对应点的几何位置有关。这些位置的相互关系由摄像机成像系统的几何投影模型所决定,理想的成像模型是光学中的中心投影,也成为针孔模型,即假设物体表面的反射光都经过一个针孔而投影到像平面上,也就是满足光的直线传播条件。小孔成像透光量太小,需要长时间的曝光,实际摄像系统通常都由透镜或者透镜组组成。由于透镜设计的复杂性和工艺水平等影响,实际透镜成像系统不可能严格满足针孔模型,这也就产生了所谓的镜头畸变,常见的如径向畸变、切向畸变、薄棱镜畸变等,在远离图像中心处会有较大的畸变,在精密视觉测量等应用方面,应该尽量采用非线性模型来描述成像关系。
4.常用坐标系及其关系:计算机视觉常用坐标系采用右手准则来定义,通常有三个不同层次的坐标系统:世界坐标系、摄像机坐标系、图像坐标系(图像像素坐标系、图像物理坐标系)。如下图所示:

(1)世界坐标系(Ow-Xw,Yw,Zw):是客观世界的绝对坐标,由用户任意定义的三维空间坐标系,一般的3D场景都用这个坐标系来表示。
(2)摄像机坐标系(Oc-XcYcZc):以小孔摄像机模型的聚焦中心为原点,以摄像机光轴zc轴建立的三维直角坐标系。x,y一般与图像物理坐标系xf,yf平行,且采取前投影模型。
(3)理想图像坐标系(Oi-XuYu)
(4)实际图像坐标系(Oi-XdYd)
世界坐标系变为摄像机坐标系(三维空间刚体位置的变换):
,式中:
为旋转矩阵;
为平移矩阵。
摄像机坐标系变为理想图像坐标系(投影变换):

理想图像坐标系变为实际图像坐标系(考虑畸变):镜头的畸变主要由径向畸变引起,二级径向畸变的镜头模型为:

用齐次坐标表示为:

式中:k1和k2为径向畸变系数;A'为两者等效变换矩阵。
实际图像坐标变换为像素图像坐标:

用齐次坐标表示为:

式中:(U0,V0)为图像中心O1在O-UV中的坐标;Sx、Sy分别为图像平面上X、Y轴方向单位距离上的像素数;γ为两坐标轴间的倾斜因子。
由上面的公式可以得到:

式中:M1由Sx,Sy,U0,V0,f,k1,k2确定,只与摄像机本身的性质有关,这些参数为摄像机的内部参数;M2由旋转矩阵R和平移向量T确定,为摄像机的外部参数。
以上就是标定算法的核心部分。在EMGU中使用CameraCalibration来完成对摄像头的标定,得到内参及外参。
代码后期附上:
C#下的摄像机标定的更多相关文章
- [OpenCV-Python] OpenCV 中摄像机标定和 3D 重构 部分 VII
部分 VII摄像机标定和 3D 重构 OpenCV-Python 中文教程(搬运)目录 42 摄像机标定 目标 • 学习摄像机畸变以及摄像机的内部参数和外部参数 • 学习找到这些参数,对畸变图像进行修 ...
- 机器视觉学习笔记(5)——基于OpenCV的单目摄像机标定
本文CameraCalibrator类源代码来自于OpenCV2 计算机视觉编程手册(Robert Laganiere 著 张静 译) 强烈建议阅读机器视觉学习笔记(4)--单目摄像机标定参数说明之后 ...
- 基于EmguCV的摄像机标定及矫正
标签: EmguCV摄像头标定C# 2015-05-03 14:55 501人阅读 评论(6) 收藏 举报 分类: C# 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] ...
- 用OpenCV进行摄像机标定
用OpenCV进行摄像机标定 照相机已经存在很长时间了.然而,随着廉价针孔相机在20世纪末的引入,日常生活中变得司空见惯.不幸的是,这种廉价伴随着它的代价:显著的扭曲.幸运的是,这些常数,通过校准和一 ...
- [zt]摄像机标定(Camera calibration)笔记
http://www.cnblogs.com/mfryf/archive/2012/03/31/2426324.html 一 作用建立3D到2D的映射关系,一旦标定后,对于一个摄像机内部参数K(光心焦 ...
- halcon摄像机标定
摄像机标定程序: 注意:E:/calibration_image :为标定图像文件路径 'E:/calibration_description/caltab_123mm.descr:为标定 ...
- 【OpenCV】摄像机标定+畸变校正
摄像机标定 本文目的在于记录如何使用MATLAB做摄像机标定,并通过OpenCV进行校正后的显示. 首先关于校正的基本知识通过OpenCV官网的介绍即可简单了解: http://docs.open ...
- Matlab 摄像机标定+畸变校正
博客转载自:http://blog.csdn.net/Loser__Wang/article/details/51811347 本文目的在于记录如何使用MATLAB做摄像机标定,并通过opencv进行 ...
- opencv单目摄像机标定(一)
#include <string> #include <iostream> #include <cv.h> #include <highgui.h> u ...
随机推荐
- JavaScript 之类型转换
数值转换成字符串类型 1.利用 “+” 将数值加上一个长度为零的空字符串. 2.通过toString()方法.加入参数可以直接进行进制的转换. <script language="ja ...
- Liunx 重新mount
https://zhidao.baidu.com/question/349907351.html
- (转)Kettle命令行
kettle使用命令行来运行ktr和kjb 1:cmd方式运行 1.ktr的运行:运行transformation文件是通过Pan.bat来运行的. 打开cmd命令行窗口,转到Pan.bat所在的目录 ...
- HDU 1027 Ignatius and the Princess II[DFS/全排列函数next_permutation]
Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ( ...
- Unix/Linux提权漏洞快速检测工具unix-privesc-check
Unix/Linux提权漏洞快速检测工具unix-privesc-check unix-privesc-check是Kali Linux自带的一款提权漏洞检测工具.它是一个Shell文件,可以检测 ...
- Codeforces 919 D Substring
题目描述 You are given a graph with nn nodes and mm directed edges. One lowercase letter is assigned to ...
- 解决unknown import path "golang.org/x/sys/unix": unrecognized import path "golang.org/x/sys"
问题描述 当我们使用 go get.go install.go mod 等命令时,会自动下载相应的包或依赖包.但由于众所周知的原因,类似于 golang.org/x/... 的包会出现下载失败的情况. ...
- windows 屏幕坐标 窗口坐标 客户区坐标 逻辑坐标 设备坐标之间的关系及转换
设置坐标映射 (1)Windows坐标系统 Windows坐标系分为逻辑坐标系和设备坐标系两种,GDI支持这两种坐标系.一般而言, GDI的文本和图形输出函数使用逻辑坐标,而在客户区移动或按下鼠 ...
- 过滤器Filter_03_多个Filter的执行顺序
过滤器Filter_03_多个Filter的执行顺序 学习了:https://www.cnblogs.com/HigginCui/p/5772514.html 按照在web.xml中的顺序进行filt ...
- oracle手动修改listener.ora和tnsnames.ora之后竟然无效
oracle手动修改listener.ora和tnsnames.ora之后竟然无效 花式重启都没有生效,需要使用Net Configuration Assistant来进行刷一下,重新生成的监听还是一 ...