三维重建代码实现(一)

写在开头

最近在学习三维重建的相关知识,打算将三维重建SFM的整个过程用代码的形式梳理一下,本章节主要实现相机标定的基础知识。
这里我们假定你有一定的三维重建相关的基本知识,作者在这里推荐高翔博士的《视觉SLAM十四讲:从理论到实践》,在B站上有高翔博士的讲解视频。

相机模型

针孔相机模型

针孔相机模型

如图所示,这是一个针孔相机模型。图中的字母解释如下:

  • O是相机中心,代表相机镜头。
  • z是相机的主轴,相机坐标系就是由XYZO构成。
  • f是相机模型的焦距。
  • \tilde O是三维点,q是三维点在图像平面上的投影。

坐标系

三维重建中涉及到四个坐标系:分别是世界坐标系、相机坐标系、图像坐标系、像素坐标系。

  • 世界坐标系:(X_w, Y_w, Z_w),代表物体在三维世界的真实坐标。
  • 相机坐标系:(X_c, Y_c, Z_c),以相机中心O为坐标系原点,Z轴为相机的光轴。
  • 图像坐标系:(X_{pic}, Y_{pic}),在图像平面上,是二维坐标系。
  • 像素坐标系:(u, v),也是二维坐标系,只不过原点在左上角,单位是像素。

坐标系之间的转换

世界坐标系转换为相机坐标系

设某点在世界坐标系中的坐标为(X_w,Y_w,Z_w),在相机坐标系中的矩阵为(X_c,Y_c,Z_c)
则两个坐标系之间的关系为:
\left[ \begin{matrix} X_C\\Y_c\\Z_c \end{matrix} \right] = R\left[ \begin{matrix} X_w\\Y_w\\Z_w \end{matrix} \right] t
转化为其次形式:
\left[ \begin{matrix} X_C\\Y_c\\Z_c\\1 \end{matrix} \right] = \left[ \begin{matrix} R & t \\ 0 & 1 \end{matrix} \right] \left[ \begin{matrix} X_w\\Y_w\\Z_w\\1 \end{matrix} \right]
Rt统称为外部参数。

相机坐标系转换为图像坐标系

以O点为原点建立相机坐标系,点Q(x_c,y_c,z_c)为相机坐标系空间中的任意一点,假设该点被光线投影到平面上的q(x_pic,y_pic)点上。
由小孔模型中的相似三角形关系,我们可以得到:
\frac {f} {z_c} = \frac {x_{pic}} {x_c} = \frac {y_{pic}} {y_c}
转换为矩阵形式:
z_c \left[ \begin{matrix} x_{pic}\\y_{pic}\\1 \end{matrix} \right] = \left[ \begin{matrix} f & 0 & 0 & 0\\ 0 & f & 0 & 0\\ 0 & 0 & 1 & 0 \end{matrix} \right] · \left[ \begin{matrix} x_c\\y_c\\z_c\\1 \end{matrix} \right]

图像坐标系转换为像素坐标系

先设每个像素的物理尺寸为 dx×dy(mm^2)
那么对于点在像素坐标系中的坐标(u,v)
\left\{\begin{array}{l} u=u_{0}+\frac{x_{p i c}}{d x} \\ v=v_{0}+\frac{y_{p i c}}{d y} \end{array}\right.

改写为矩阵形式:
\left[\begin{array}{l} u \\ v \\ 1 \end{array}\right]=\left[\begin{array}{lll} \frac{1}{d x} & 0 & u_{0} \\ 0 & \frac{1}{d_{y}} & v_{0} \\ 0 & 0 & 1 \end{array}\right]\left[ \begin{array}{c} x_{p i c} \\ y_{p i c} \\ 1 \end{array}\right]

世界坐标系转换为像素坐标系

将以上几个变换综合起来,我们就可以写作:
z_{c}\left[\begin{array}{c} u \\ v \\ 1 \end{array}\right]=\left[\begin{array}{ccc} \frac{1}{d_{x}} & 0 & u_{0} \\ 0 & \frac{1}{d_{y}} & v_{0} \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{cccc} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \end{array}\right] \cdot\left[\begin{array}{cc} R & t \\ 0 & 1 \end{array}\right]\left[\begin{array}{c} x_{w} \\ y_{w} \\ z_{w} \\ 1 \end{array}\right]

继续计算一下可得:

z_{c}\left[\begin{array}{l} u \\ v \\ 1 \end{array}\right]=\left[ \begin{array}{llll} f_{x} & 0 & u_{0} & 0 \\ 0 & f_{y} & v_{0} & 0 \\ 0 & 0 & 1 & 0 \end{array}\right] \cdot\left[ \begin{array}{ll} R & t \\ 0 & 1 \end{array}\right]\left[\begin{array}{l} x_{w} \\ y_{w} \\ z_{w} \\ 1 \end{array}\right]

其中,f_{x}=\frac{f}{d_{x}}, f_{y}=\frac{f}{d_{y}}

  • 上式中的f_x, f_y, u_0, v_0参数只和相机有关,与相机所拍摄的照片无关,所以称之为相机的内部参数,下一节我们就是要求解这个参数,成为相机标定。
  • 上式中的R, t称为相机的外部参数,与相机拍摄的图像有关,它反映的是世界坐标系和相机坐标系之间的关系。

透镜畸变

到前面为止的内容都是有关针孔相机模型的,但是针孔可以透过的光线太少,成像慢且不清晰,所以往往都会加上凸透镜以汇聚更多的光线。但是加上凸透镜之后,不可避免地,就会产生透镜畸变。透镜畸变有两种:径向畸变、切向畸变。

径向畸变

对于某些透镜,光线在远离透镜中心的地方比靠近中心的地方弯曲更厉害,产生“筒形”或“鱼眼”现象。
一般来讲,成像中兴点的径向畸变为0,越向边缘移动,畸变越严重。通常,径向畸变通过下面的公式来校正,常用偶次幂的泰勒公式描述径向畸变:

\left\{\begin{array}{l} x_{ \text {corrected}}=x\left(1+k_{1} r^{2}+k_{2} r^{4}+k 3 r^{6}\right) \\ y_{ \text {corrected}}=y\left(1+k_{1} r^{2}+k_{2} r^{4}+k 3 r^{6}\right) \end{array}\right.
上式中:(x,y)是畸变点在图像中的原始位置,r为该点到成像面中心的距离,(x_{corrected},y_{corrected})为校正后的新位置。

切向畸变

切向畸变是由于摄像机制造上的缺陷使得透镜本身与图像平面不平行而产生的,可定量描述为:

\left\{ \begin{array}{l} x_{\text {corrected}}=x+\left[2 p_{1} y+p_{2}\left(r^{2}+2 x^{2}\right)\right] \\ y_{\text {corrected}}=y+\left[p_{1}\left(r^{2}+2 y^{2}\right)+2 p_{2} x\right] \end{array}\right.
上式中:(x,y)是畸变点在图像中的原始位置,r为该点到成像面中心的距离,(x_{corrected},y_{corrected})为校正后的新位置。

透镜畸变校正

我们进行透镜畸变校正,就是要确定k_1、k_2、k_3、p_1、p_2这5个参数。

参考文件

博客

http://blog.csdn.net/aptx704610875/article/details/48914043
http://blog.csdn.net/xuelabizp/article/details/50314633
https://www.cnblogs.com/Jessica-jie/p/6596450.html
https://blog.csdn.net/hongbin_xu/article/details/78934897

书籍

《视觉SLAM十四讲:从理论到实践》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容