草庐IT

白学立体视觉(2): 相机内外参数与坐标系

Dear Nicole 2023-04-04 原文

文章目录


前言

亲爱的小伙伴们,本节将要分享的是双目视觉中涉及的相机成像几何,坐标系和相机参数等概念。


一、小孔成像

相信大家中学时期都在物理课程中了解过一个概念:小孔成像。用一个带有小孔的不透光板放在投影板和蜡烛之间,投影板上就会出现蜡烛倒立的实像,物理老师告诉我们这样的现象叫小孔成像,这样的成像模型被称为针孔模型(Pinhole mode)。而且,前后移动中间的板,投影板上成像的大小也会随之发生变化,这种现象说明了光沿直线传播的性质。物理世界中的一点、其在投影板上投影点、小孔中心三点共线,这种特征是成像分析的基础,被称为中心投影或者透视投影。


相机成像模型其实就是针孔模型的扩展,针孔模型由于通过小孔的光线量不足,所以投影板上的成像较为模糊。聪明的发明家为了解决这个问题,在相机中使用了凸透镜汇聚足够的光线在感光芯片上。这也就是我们生活中相机的构造原理。过程如图所示:


针孔模型成像以针孔为相机中心,倒影为成像平面。 感光芯片到透镜中心之间的距离为焦距F。为了方便观看和分析,可以将成像平面放到相机前方,构成一个虚拟成像面,也保持其与透镜中心的距离为焦距F,这样等效像平面上图像不再倒立,如下图所示:

二、坐标系介绍

相机成像设计到的几个非常重要的坐标系,分别是:世界坐标系,相机坐标系,图像物理坐标系,图像像素坐标系。我们设三维世界空间中的一点P的世界坐标系为Xw,对应的相机坐标系坐标为Xc,对应的图像物体坐标系的坐标为(x,y)T,对应的图像像素坐标系的坐标为(u,v)T

1.世界坐标系

世界坐标系是一个三维直角坐标系。有了世界坐标系,以其为基准,可以确定目标物体在三维空间中的数学表达式。世界坐标系的位置可以根据实际情况自由确定。我们设三维世界空间中的一点P的世界坐标系为Xw=(xw,yw,zw)T

2.相机坐标系

相机坐标系的坐标原点为相机的光心位置,X 轴和Y 轴分别平行于图像坐标系的X轴和 Y 轴,Z 轴为相机的光轴。世界坐标系中的P点在相机坐标系中用Xc=(xc,yc,zc)T 表示。

3.图像物理坐标系

坐标原点为CCD 图像平面的中心,X轴和Y 轴分别平行于图像平面的两条垂直边。图像物理坐标系中的点,用(x,y)T表示。图像物理坐标系是用物理单位(例如毫米)表示像素在图像中的位置。

4.图像像素坐标系

相机机采集图像后以标准电视信号的形式输入计算机,在计算机中以M × N矩阵(M 行 N 列的图像中的每一个元素的数值被称为图像点的灰度)保存。在图像上定义图像像素坐标系(Ot, u, v),每一个像素的坐标(u,v)分别表示该像素在数组中的列数与行数。坐标原点为图像平面的左上角顶点,X 轴和Y 轴分别平行于图像物理坐标系的 X 轴和Y 轴。图像像素坐标系中的点,用(u,v)T表示。像素坐标系就是以像素为单位的图像坐标系。

三、坐标系相互转换

1.世界坐标系到相机坐标系

由于世界坐标系和相机坐标系都是三维坐标系,所以他们之间的变换为刚体变换,即可以通过旋转和平移得到。坐标系之间的转换如下图所示:

世界坐标系到相机坐标系的变换公式为:

相反,相机坐标系到世界坐标系的变换公式为:

相机中心在世界坐标系中的位置为(这个很重要):

2.相机坐标系到图像物理坐标系

如下图所示,相机坐标系下的点P通过透视投影,在图像物理坐标系上成像为p(x,y)。
根据相似三角形原理可以得到:

上式可以表示为矩阵形式,其中f为相机焦距,r是x轴和y轴的不垂直因子,也称物理坐标的扭曲因子,在现在的相机中一般r为0,通常在相机标定中忽略不计:

归一化像平面为一个虚拟的平面,与CCD成像平面平行,且距离相机光心距离为1。相机坐标系到归一化像平面坐标系之间变换如下图所示:
下图可以更可观的描述相机坐标系和归一化像平面坐标系之间的变换关系:

变换公式为:

3.图像物理坐标系到图像像素坐标系


若O2在u,v坐标系中的坐标为(u0,v0,每一个像素在x轴与y轴方向上的物理尺寸为dx,dy,则图像中任意一个像素在两个坐标系下的坐标有如下关系:

上式可以表示为矩阵形式:

4.世界坐标系到图像像素坐标系

掌握了以上各个坐标系的转换关系,也就理解了相机透视投影的概念。下面我们可以把几个坐标系穿起来,得到世界坐标系表示的Pw点坐标与其投影点p的坐标(u,v)的对应关系:

最终可以用下式表示:

其中,ax、ay(ax 和 ay 被称为等效焦距,有时候也用Fx 和 Fy表示)、r、u0、v0为相机内参,R和t为相机外参。相机的内参和外参就是相机标定要计算的结果,相机标定将在后面小结进行详细的介绍。

三、镜头畸变

上述的相机模型为理想条件下的相机成像模型,而实际的成像过程往往存在偏差,即畸变。由于相机物镜系统设计、制作、装配等因素所引起的,像点偏离其理想位置点的误差称为光学畸变,如下图所示:

相机的针孔模型,只是真实相机的一个近似,由于存在各种镜头的畸变和变形,所以真实的相机要比模型复杂的多。在引入各种非线性的畸变修正之后,就形成看复杂的非线性成像模型。镜头的畸变主要分为径向畸变、离心畸变和薄棱镜畸变三类。

.1 径向畸变

定义:径向畸变像点沿径向方向偏离标准理想位置。径向畸变又分正向畸变和负向畸变,正向畸变称为枕形畸变,负向畸变称为桶形畸变;
特点:由镜头的形状缺陷所造成的畸变,关于相机主光轴对称。

光学镜头径向曲率的变化是引起径向畸变的主要原因,这种变形会使得图像点沿径向移动,离中心点越远其变形的位移量越大。

对于图像的径向畸变,通常采用多项式拟合算法,假设图像中的像素点理想的坐标为(Xd,Yd),畸变后坐标为(Xr,Yr),则:

由于径向畸变只跟像素点离图像中心的距离有关,因此在直角坐标系中有:

将该式带入上式得:

.2 离心畸变

定义:光学系统的光学中心和几何中心不一致(镜头各器件的光学中心)所造成的畸变;
特点:既包含径向畸变,又包含镜头主光轴不对称多造成的切向畸变。

由于镜头装配误差,组成光学系统的多个光学镜头的光轴不可能完全共线,从而引起离心畸变,这种畸变是由径向变形分量和切向变形分量共同构成,其数学模型为:

.3 薄棱镜畸变

定义:镜头设计缺陷与加工安装误差所造成;
特点:同时引起径向畸变和切向畸变,高价位镜头可以忽略薄棱镜畸变。

薄棱镜畸变是指由光学镜头制造误差和成像敏感阵列制造误差引起的图像变形,这种变形是由径向变形分量和切向变形分量共同构成,其数学模型为:


总结

这个小结呢,主要说的是相机成像的数学模型,很重要,这是双目视觉的基础。一定要掌握,本身其实不难,自己画画图,很容易理解。有不懂得随时欢迎评论区沟通。

对了,小伙伴们,下一节就是带点实践的内容了,也就是文中提到的相机标定,到时候会提供代码和数据供大家学习。

有关白学立体视觉(2): 相机内外参数与坐标系的更多相关文章

  1. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  2. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  3. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

    我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

  4. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

  5. ruby-on-rails - 在默认方法参数中使用 .reverse_merge 或 .merge - 2

    两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option

  6. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  7. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  8. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

  9. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  10. [工业相机] 分辨率、精度和公差之间的关系 - 2

    📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

随机推荐