草庐IT

【三维重建】相机成像及坐标系之间的转换

dahei_zy 2023-04-10 原文

系列文章目录

本系列开始于2022.12.25,开始记录三维重建项目课题研究时的学习笔记,其中主要分为以下几部分组成:

一、相机成像及坐标系之间的转换关系

二、相机标定:张友正标定法

三、特征检测与匹配

四、运动恢复结构法


文章目录

系列文章目录

文章目录

前言

一、相机成像原理

1.1 小孔成像模型 

1.2 三维表达 

二、坐标系以及之间的转换

2.1 世界坐标系转相机坐标系

2.2 相机坐标系转图像坐标系

2.3 图像坐标系转像素坐标系

 2.4 总变换关系表达

总结

参考


前言

        三维重建是要使用二维信息恢复三维信息,而被动视觉方法所使用的二维信息即为图像序列,首先要想从二维到三维,我们首先应建立三维到二维的数学模型,再研究怎样通过已建立的数学模型,来逆向求解。所以本文主要介绍相机成像原理以及世界坐标系、相机坐标系、图像坐标系和像素坐标系之间的关系,建立三维到二维的数学模型,为后面恢复三维信息打下基础。


一、相机成像原理

1.1 小孔成像模型 

        在研究相机成像问题时最常用的相机成像模型为针孔成像也叫小孔成像,其简化相机透镜为一小孔,如下图所示:

        但是上图成像为倒像不利于后续研究,所以成像模型就将像面移到了透镜的前方,方便后续的研究,此时的像为正像,并将小孔称为光心:

         对于小孔成像模型其忽略了相机的畸变等影响,但是后期可以引用一系列的畸变等参数进行补充小孔成像模型。

1.2 三维表达 

        将小孔成像模型的三维表达如图所示:

二、坐标系以及之间的转换

        坐标系的种类主要有以下几种:

        (1)世界坐标系:描述目标在真实世界中的位置引入的参考坐标系。

        (2)相机坐标系:联系世界坐标系与图像坐标系的桥梁,一般取摄像机的光学轴为z轴。
        (3)图像坐标系:根据投影关系引入,方便进一步得到像素坐标,单位为毫米,坐标原点为摄像机光轴与图像物理坐标系的交点位置。
        (4)像素坐标系:真正从相机内读到的信息,图像物理坐标的离散化,以像素为单位,坐标原点在左上角。

2.1 世界坐标系转相机坐标系

        世界坐标系与相机坐标系之间的转换属于刚体变换,物体不会发生形变,只是坐标系之间进行了平移与旋转。对于这之间的刚性变换(刚性运动),就是对原坐标系乘一旋转矩阵R再加一平移向量T,使得两坐标轴的原点、X轴、Y轴和Z轴重合。

        将一坐标系分别绕其X轴、Y轴和Z轴进行旋转不同的角度可以得到相应的旋转矩阵。以绕z轴旋转为例:

 由此可得:

 所以原世界坐标三维点P点坐标转换到相机坐标系如下:

 R为3×3矩阵;T为3×1矩阵。

2.2 相机坐标系转图像坐标系

        世界坐标系转换到相机坐标系是三维坐标之间得转换,而相机坐标系转换为图像坐标系是三维到二维之间得转换。

 由图中三角形相似关系可得:

        此时,P点坐标已经转换成了p点坐标 ,但是此时的p坐标的单位不是像素pixel,而是mm,下面将进行图像坐标系转换像素坐标系,转换后的坐标单位将变为pixel。

2.3 图像坐标系转像素坐标系

       像素坐标系和图像坐标系在理想情况下都位于同一平面(像面),但二者的单位与原点位置不同。图像坐标系的原点为光轴与像面的交点o,单位为mm;像素坐标系的原点一般定义为图像的左上角Ouv,单位为pixel,一般采用(u,v)来表示u列v行。dx和dy表示每一列和每一行分别代表多少mm,即1pixel=dx mm。

        但有时由于相机的制造中的问题,图像坐标系和像素坐标系会存在一定的偏差,这时就要引入坐标系偏移系数来进行纠正。 对于两坐标系的偏差要求出图像坐标系中p点投影在像素坐标系中的位置。

         可以理解为在图像坐标系(x, y)下,像素坐标系横纵坐标轴之间的夹角。理想情况下,两坐标系位于同一平面,则为90°,相机制造时,此方面的问题越小,越趋近于90°。 

        此部分为在阅读资料时发现,有的资料在相机内参部分有一参数(下面总表达式中体现),有的则没有,为弄清楚相机内参中此参数的含义,查阅资料得出如上结论。

 2.4 总变换关系表达

        此处的参数可由图像坐标系和像素坐标系偏差部分求出,且上下式中的  不同,为后续表示和计算方便,都表示为  。相机内参K在此处表示为3×4,但是在后续计算中往往会将最后一列省略写为3×3的矩阵。

三、相机畸变(distortion

        以上情况讨论均不包含相机畸变,在这单独讨论。相机畸变原因主要是透镜,所以相机畸变也叫透镜畸变。

        相机畸变产生的位置在理想图像坐标系到实际图像坐标系中,也就是在相机转图像坐标系时。畸变主要分为径向畸变和切向畸变,还有一些其他畸变比如:薄透镜畸变等等,但由于其他畸变的影响较小,并且较为复杂的畸变模型会影响畸变的分析精度,所以在此仅考虑径向畸变和切向畸变。

3.1 径向畸变(Radial distortion

        产生原因:透镜形状的制造工艺,透镜中心畸变小,边缘畸变大。其中类型又包含桶形畸变和枕形畸变。

常用r=0处的泰勒级数展开的前几项来近似描述径向畸变:

        其中:为代求畸变参数;(x, y)为畸变前坐标;为矫正坐标。r为图像像素点到图像中心点的距离,即

3.2 切向畸变(tangential distortion

        产生原因:透镜和CMOS或者CCD的安装位置误差。因此,如果存在切向畸变,一个矩形被投影到成像平面上时,很可能会变成一个梯形。矫正前后的坐标关系为:

        其中:为代求畸变参数;(x, y)为畸变前坐标;为矫正坐标。r为图像像素点到图像中心点的距离,即

        所以矫正相机畸变所需要的畸变参数有5个:


总结

        相机内参和相机外参可以通过标定方法获得,除此之外,标定方法还可以获得相应相机的畸变等参数,应用较为广泛的就是张正友标定法。以上内容为三维重建中坐标系之间转换的相关知识学习笔记。本系列下一步分为张正友标定法,求取相机的内外参数矩阵。

参考

1、http://t.csdn.cn/Dc7Ix

2、http://t.csdn.cn/9L81q

3、http://t.csdn.cn/beTFe 

有关【三维重建】相机成像及坐标系之间的转换的更多相关文章

  1. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  2. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  3. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  4. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  5. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  6. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  7. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  8. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

  9. ruby-on-rails - 使用 ruby​​ 将多个实例变量转换为散列的更好方法? - 2

    我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。

  10. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

随机推荐