zoukankan      html  css  js  c++  java
  • 相机标定成像原理

    知乎

    机器视觉的相机标定到底是什么?

    之前做识别算法现在开始学习标定。用matlab。
    刚开始看标定,先从单个相机开始看。标定板为何需要在不同角度拍20张照片?每次拍照时标定板位置放置有什么讲究?
    大概科普下吧,细节我再琢磨,计算工作基本没看懂。

    2 条评论分享

    按投票排序按时间排序

    5 个回答

    立党,Visual SLAM Researcher

    谢邀,简单来说,就是复原相机模型的3D空间至2D空间的一一对应关系。

    在去除畸变的情况下,相机标定就是求intrinsic matrix——K,因为3D点可以用(X,Y,Z,1)表示,2D点可以用(X,Y,1)来表示,因此3*3的矩阵K就包含了全部相机模型的内部参数(intrinsic matrix),K[R|t]就是三维点到二维点的线性变化关系(R是3-by-3 Rotation,t是translation,如果以其中一个相机C0为Reference Camera,那么R=eyes(3),t=[0,0,0]',其他的R和t都是关于C0的R和t)。

    在去除畸变的理想情况下,K的参数可以一一对应到针孔相机的焦距f,offset (x0,y0)以及skew s四个参数上,具体关系为K=[fx,s,x0;0,fy,y0;0,0,1]。理想情况的针孔相机,fx=fy,但是在大部分实测情况下,fx和fy之间仍然会有误差。

    理想状态下,Zhang's method的二维标定板的摆放不影响标定结果。但考虑到三维点实际投射到相机sensor上的误差符合Gaussian distribution,因此尽量把所有网格包含在图像内,不要角度过于偏,过于远乃至偏到了toolbox无法精确提取calibration board的边界即可。

    畸变模型可以是高阶线性甚至非线性的,通常相机厂商已经内置了去畸变的方法,输出的图像很精准了,当然如果有再次去畸变的要求可以阅读相关论文,反正我最高也只实现过三次线性畸变移除。

    20张当然不是定数,但理论上张数越多,normalize之后解中间那个矩阵误差越小,上课时老师讲过误差分析,具体的我一时想不起来,Berkeley的课件上应该有。

    当然也有三维的标定方法(拿一组三维的,互成90度的黑白格放在一起,并提取其中若干点),一维的标定(也是张正友提出的方法,在一根木棒上标定若干点,然后把一端放在桌子上,另一端做圆锥形运动,拍下若干张。这也是我上这门课的final project)等等等等。总之都是用几何关系尽可能地找到K。

    (我只回答关于相机模型问题。关于单反相机的使用,保养,技巧以及相机选购问题一律不懂,大家就不要邀请我了,靴靴

    知乎用户,求小伙伴猛击http://wp.me/p2PLRc-aX

    @立党已经解释地很不错了,我再从另外一些角度说一下吧。

    相机标定的目的是确定相机的一些参数的值。通常,这些参数可以建立定标板确定的三维坐标系和相机图像坐标系的映射关系,换句话说,你可以用这些参数把一个三维空间中的点映射到图像空间,或者反过来。

    相机需要标定的参数通常分为内参和外参两部分。外参确定了相机在某个三维空间中的位置和朝向,至于内参,可以说是相机内部的参数(这好像是废话...笑),我觉得需要引入一点光学的东西来更好地解释一下。现有的相机都至少包含一个光学镜头和一个光电传感器(CCD或CMOS)。

    通过镜头,一个三维空间中的物体经常会被映射成一个倒立缩小的像(当然显微镜是放大的,不过常用的相机都是缩小的),被传感器感知到。

    · 理想情况下,镜头的光轴(就是通过镜头中心垂直于传感器平面的直线)应该是穿过图像的正中间的,但是,实际由于安装精度的问题,总是存在误差,这种误差需要用内参来描述;

    · 理想情况下,相机对x方向和y方向的尺寸的缩小比例是一样的,但实际上,镜头如果不是完美的圆,传感器上的像素如果不是完美的紧密排列的正方形,都可能会导致这两个方向的缩小比例不一致。内参中包含两个参数可以描述这两个方向的缩放比例,不仅可以将用像素数量来衡量的长度转换成三维空间中的用其它单位(比如米)来衡量的长度,也可以表示在x和y方向的尺度变换的不一致性;

    · 理想情况下,镜头会将一个三维空间中的直线也映射成直线(即射影变换),但实际上,镜头无法这么完美,通过镜头映射之后,直线会变弯,所以需要相机的畸变参数来描述这种变形效果。


    然后,说到为什么需要20张图片,这只是一个经验值,实际上太多也不好,太少也不好。单纯从统计上来看,可能越多会越好,但是,实际上图片太多可能会让参数优化的结果变差,因为棋盘格角点坐标的确定是存在误差的,而且这种误差很难说是符合高斯分布的,同时,标定过程所用的非线性迭代优化算法不能保证总是得到最优解,而更多的图片,可能会增加算法陷入局部最优的可能性。

    拍照时的标定板位置和朝向的多样性,会让内参的估计更为准确。准确的内参可以较好地把整个图像的畸变都进行矫正,但如果给定的标定板的位置过于单一,比如都是在图像的左上角,那么优化得到的内参也可能只会比较好地纠正图像左上角的畸变。推荐找个畸变较大的镜头做做实验,会更形象。

    编辑于 2015-11-29 1 条评论感谢分享

    收藏没有帮助•举报

    作者保留权利收起

    basicbeyond,机器视觉应用工程师,非算法工程师

    标定的作用其一就是为了求取畸变系数(因为经过镜头等成像后,或多或少都有畸变),其二是为了得到空间坐标系和图像坐标系的对应关系。标定的过程就是一个最小化的求取参数的过程,拍的图越多(相当于输入)结果越准确,至少10张以上吧,而且尽可能覆盖视野各个角落,要偏转一定角度,这样得出的参数是只用于整个场景的

    发布于 2015-04-10 4 条评论感谢分享

    收藏没有帮助•举报

    作者保留权利

    杂烩饭大人,码农

    先仔细看下论文不好么?
    标定的方法有好多,想必你是看的张氏标定法,那就找论文看看啊
    Zhengyou Zhang, A Flexible New Technique for Camera Calibration
    http://research.microsoft.com/en-us/um/people/zhang/Papers/TR98-71.pdf
    标定板为何需要在不同角度拍20张照片?
    张氏标定法理论上最少需要2张,要提高精度当然得多一点,太多又不好,浪费时间,20张不知是谁的经验值,具体看你需求,
    张数的讨论可以看论文 “Performance w.r.t. the number of planes.”部分
    每次拍照时标定板位置放置有什么讲究?
    看论文“Performance w.r.t. the orientation of the model plane.”部分
    写的很明白为什么不自己先看看呢

    发布于 2015-04-11 2 条评论感谢分享

    收藏没有帮助•举报

    作者保留权利

    路人贾

    1.gif2.gif3.gif4.gif5.gif6.gif7.dxf7.gif8.gif

  • 相关阅读:
    Taglib笔记摘自http://tech.acnow.net/Html/Program/Java/200204/10/092611588.shtml
    Subversion安装手记
    java 数组排序
    JAVA 反编译
    开发EJB
    HTML 4.0 语 法 教 学 转载http://chinese.allproducts.com.tw/GB/html/#t1
    javaCollectionslist
    Ruby on Rack #1 与Rack的第一次亲密接触
    Ubuntu 安装 ruby on rails [转]来源:Ubuntu社区 作者:承古韵
    收集整理的对#!bin/sh的认识
  • 原文地址:https://www.cnblogs.com/gosteps/p/5289941.html
Copyright © 2011-2022 走看看