图(1) 针孔相机模型

在谈到针孔相机模型时,首先要搞清楚以下几个坐标系:
世界坐标系:世界坐标系也称绝对坐标系,是一个基准坐标系,可以根据根据实际情况进行指定。世界坐标系中的点我们用(XwX_wXw​, YwY_wYw​, ZwZ_wZw​)T表示。
相机坐标系:图中的O-x-y-z为相机坐标系,以光心O(也是相机的针孔)为原点,相机坐标系会随着相机的运动不断发生变化。相机坐标系中的点我们用(XcX_cXc​, YcY_cYc​, ZcZ_cZc​)T表示。
图像物理坐标系:图中的O’-x’-y’为图像物理坐标系,位于CCD/CMOS的成像平面上。图像物理坐标系中的点我们用(X′,Y′)(X', Y')(X′,Y′)表示。
像素坐标系:图中的O’‘-u-v为图像像素坐标系,像素坐标系中的点用(u,v)(u, v)(u,v)表示,它表征的是像素所在的行和列。

针孔相机模型实际是将世界坐标系中的空间点映射到像素坐标系中,那么如果已知PPP点在世界坐标系中的坐标为(XwX_wXw​, YwY_wYw​, ZwZ_wZw​)T,怎么求PPP点在像素坐标系下投影的坐标(u,v)(u, v)(u,v)呢?

1、世界坐标系 —> 相机坐标系

世界坐标系与相机坐标系之间的关系为欧式变换关系,将世界坐标系下的点(XwX_wXw​, YwY_wYw​, ZwZ_wZw​)T转换到相机坐标系,可以通过旋转矩阵RRR和平移向量ttt进行变换得到:
[XcYcZc1]4∗1=[R3∗3t3∗101]4∗4.[XwYwZw1]4∗1=M4∗4.[XwYwZw1]4∗1(1)\left[ \begin{matrix} X_c \\ Y_c \\ Z_c \\ 1 \\ \end{matrix} \right] _{4*1} = \left[ \begin{matrix} R_{3*3} & t_{3*1} \\ 0 & 1 \\ \end{matrix} \right]_{4*4} . \left[ \begin{matrix} X_w \\ Y_w \\ Z_w \\ 1 \\ \end{matrix} \right] _{4*1} = M_{4*4} . \left[ \begin{matrix} X_w \\ Y_w \\ Z_w \\ 1 \\ \end{matrix} \right] _{4*1}\tag{1} ⎣⎢⎢⎡​Xc​Yc​Zc​1​⎦⎥⎥⎤​4∗1​=[R3∗3​0​t3∗1​1​]4∗4​.⎣⎢⎢⎡​Xw​Yw​Zw​1​⎦⎥⎥⎤​4∗1​=M4∗4​.⎣⎢⎢⎡​Xw​Yw​Zw​1​⎦⎥⎥⎤​4∗1​(1)
其中M4∗4M_{4*4}M4∗4​称为外参矩阵。

2、相机坐标系 —> 图像物理坐标系

图(2)

根据图(2)的相似三角形有:
Zcf=−XcX′=−YcY′(2)\frac{Z_c}{f} = -\frac{X_c}{X'} = -\frac{Y_c}{Y'} \tag{2}fZc​​=−X′Xc​​=−Y′Yc​​(2)
其中负号表示成倒立的像,fff表示相机的焦距。

若将成像平面放到三维空间点同一边,那么式(2)可简化:
Zcf=XcX′=YcY′(3)\frac{Z_c}{f} = \frac{X_c}{X'} = \frac{Y_c}{Y'} \tag{3}fZc​​=X′Xc​​=Y′Yc​​(3)
即:
{X′=fXcZcY′=fYcZc(4)\begin{cases} X' = f\frac{X_c}{Z_c} \\ Y' = f\frac{Y_c}{Z_c} \\ \end{cases} \tag{4} {X′=fZc​Xc​​Y′=fZc​Yc​​​(4)
写成矩阵形式为:
[X′Y′1]3∗1=1Zc[f000f0001]3∗3.[XcYcZc]3∗1(5)\left[ \begin{matrix} X' \\ Y' \\ 1 \\ \end{matrix} \right] _{3*1} = \frac{1}{Z_c} \left[ \begin{matrix} f & 0 & 0 \\ 0 & f &0 \\ 0 & 0 & 1 \\ \end{matrix} \right]_{3*3} . \left[ \begin{matrix} X_c \\ Y_c \\ Z_c \\ \end{matrix} \right] _{3*1} \tag{5} ⎣⎡​X′Y′1​⎦⎤​3∗1​=Zc​1​⎣⎡​f00​0f0​001​⎦⎤​3∗3​.⎣⎡​Xc​Yc​Zc​​⎦⎤​3∗1​(5)

3、图像物理坐标系 —> 像素坐标系

根据图(1),我们假设图像物理坐标系的原点O’在像素坐标系的坐标为(u0u_0u0​,v0v_0v0​),
令dx、dy分别表示单个像素在x’和y’方向上的实际物理尺寸大小,则:

{u=X′dx+u0v=Y′dy+v0(6)\begin{cases} u = \frac{X'}{dx} + {u_0} \\ v = \frac{Y'}{dy} + {v_0} \\ \end{cases} \tag{6} {u=dxX′​+u0​v=dyY′​+v0​​(6)
将式(6)写成齐次矩阵形式:

[uv1]3∗1=[1dx0u001dyv0001]3∗3.[X′Y′1]3∗1(7)\left[ \begin{matrix} u \\ v \\ 1 \\ \end{matrix} \right] _{3*1} = \left[ \begin{matrix} \frac{1}{dx} & 0 & {u_0} \\ 0 & \frac{1}{dy} & {v_0} \\ 0 & 0 & 1 \\ \end{matrix} \right]_{3*3} . \left[ \begin{matrix} X' \\ Y' \\ 1 \\ \end{matrix} \right] _{3*1} \tag{7} ⎣⎡​uv1​⎦⎤​3∗1​=⎣⎡​dx1​00​0dy1​0​u0​v0​1​⎦⎤​3∗3​.⎣⎡​X′Y′1​⎦⎤​3∗1​(7)
联立式(5)(7),将X′X'X′、Y′Y'Y′用XcX_cXc​、YcY_cYc​表示得到:
[uv1]3∗1=1Zc[1dx0u001dyv0001]3∗3.[f000f0001]3∗3.[XcYcZc]3∗1(8)\left[ \begin{matrix} u \\ v \\ 1 \\ \end{matrix} \right] _{3*1} = \frac{1}{Z_c} \left[ \begin{matrix} \frac{1}{dx} & 0 & {u_0} \\ 0 & \frac{1}{dy} & {v_0} \\ 0 & 0 & 1 \\ \end{matrix} \right]_{3*3} . \left[ \begin{matrix} f & 0 & 0 \\ 0 & f &0 \\ 0 & 0 & 1 \\ \end{matrix} \right]_{3*3} . \left[ \begin{matrix} X_c \\ Y_c \\ Z_c \\ \end{matrix} \right] _{3*1} \tag{8} ⎣⎡​uv1​⎦⎤​3∗1​=Zc​1​⎣⎡​dx1​00​0dy1​0​u0​v0​1​⎦⎤​3∗3​.⎣⎡​f00​0f0​001​⎦⎤​3∗3​.⎣⎡​Xc​Yc​Zc​​⎦⎤​3∗1​(8)
再将式(1)与式(8)联立,将XcX_cXc​、YcY_cYc​用XwX_wXw​、YwY_wYw​表示:
[uv1]3∗1=1Zc[1dx0u001dyv0001]3∗3.[f0000f000010]3∗4.[R3∗3t3∗101]4∗4.[XwYwZw1]4∗1(9)\left[ \begin{matrix} u \\ v \\ 1 \\ \end{matrix} \right] _{3*1} = \frac{1}{Z_c} \left[ \begin{matrix} \frac{1}{dx} & 0 & {u_0} \\ 0 & \frac{1}{dy} & {v_0} \\ 0 & 0 & 1 \\ \end{matrix} \right]_{3*3} . \left[ \begin{matrix} f & 0 & 0 & 0\\ 0 & f & 0 & 0\\ 0 & 0 & 1 & 0\\ \end{matrix} \right]_{3*4} . \left[ \begin{matrix} R_{3*3} & t_{3*1}\\ 0 & 1\\ \end{matrix} \right]_{4*4}. \left[ \begin{matrix} X_w \\ Y_w \\ Z_w \\ 1 \\ \end{matrix} \right] _{4*1} \tag{9} ⎣⎡​uv1​⎦⎤​3∗1​=Zc​1​⎣⎡​dx1​00​0dy1​0​u0​v0​1​⎦⎤​3∗3​.⎣⎡​f00​0f0​001​000​⎦⎤​3∗4​.[R3∗3​0​t3∗1​1​]4∗4​.⎣⎢⎢⎡​Xw​Yw​Zw​1​⎦⎥⎥⎤​4∗1​(9)
令fxf_xfx​ = f/dxf/dxf/dx,fyf_yfy​=f/dyf/dyf/dy,则式(9)可简化为:
[uv1]3∗1=1Zc[fx0u000fyv000010]3∗4.[R3∗3t3∗101]4∗4.[XwYwZw1]4∗1(10)\left[ \begin{matrix} u \\ v \\ 1 \\ \end{matrix} \right] _{3*1} = \frac{1}{Z_c} \left[ \begin{matrix} f_x & 0 & {u_0} & 0 \\ 0 & f_y & {v_0} & 0 \\ 0 & 0 & 1 & 0 \\ \end{matrix} \right]_{3*4}. \left[ \begin{matrix} R_{3*3} & t_{3*1}\\ 0 & 1\\ \end{matrix} \right]_{4*4}. \left[ \begin{matrix} X_w \\ Y_w \\ Z_w \\ 1 \\ \end{matrix} \right] _{4*1} \tag{10} ⎣⎡​uv1​⎦⎤​3∗1​=Zc​1​⎣⎡​fx​00​0fy​0​u0​v0​1​000​⎦⎤​3∗4​.[R3∗3​0​t3∗1​1​]4∗4​.⎣⎢⎢⎡​Xw​Yw​Zw​1​⎦⎥⎥⎤​4∗1​(10)
式(10)中fxf_xfx​、fyf_yfy​、u0u_0u0​、v0v_0v0​称为相机的内参数,当相机给定时是固定的;RRR和ttt为相机的外参数,反映的是世界坐标系与相机坐标系之间的关系。

参考文献:
1、高翔,视觉slam十四讲[M]

SLAM学习入门(1)针孔相机模型公式推导相关推荐

  1. 转g代码教程_图深度学习入门教程(九)——图滤波神经网络模型

    本教程是一个系列免费教程,争取每月更新2到4篇.(由于精力有限,近期停止了一段时间,在此向大家道个歉). 主要是基于图深度学习的入门内容.讲述最基本的基础知识,其中包括深度学习.数学.图神经网络等相关 ...

  2. 几种相机模型:针孔相机模型、双目相机模型、RGB-D相机——SLAM学习笔记5

    几种相机模型:针孔相机模型.双目相机模型.RGB-D相机 针孔相机模型 双目相机模型 RGB-D相机模型 针孔相机模型 针孔相机是最简单的相机,很多相机也可以看作是针孔相机来进行处理.如图1所示,空间 ...

  3. 2023年的深度学习入门指南(14) - 不能只关注模型代码

    2023年的深度学习入门指南(14) - 不能只关注模型代码 最近,有一张大模型的发展树非常流行: 这个图是相当不错的,对于加深对于Transformer模型编码器.解码器作用的理解,模型的开源和闭源 ...

  4. 【多传感融合】优达学城多传感融合学习笔记(一)——针孔相机模型

    针孔相机模型 目录 针孔相机模型 针孔相机成像模型 镜头和光圈 枕形畸变和桶形畸变 图像标定和校准概念 三维坐标系到像素坐标系的转换 图像传感器和拜耳阵列(Bayer Pattern) CCD vs. ...

  5. 视觉SLAM——针孔相机模型 相机标定原理 双目相机模型 深度相机对比

    前言 本博客为主要学习<视觉SLAM十四讲>第5讲.<机器人学的状态估计>第6章6.4.1透视相机.<多视图几何>第5章摄像头模型等SLAM内容的总结与整理. 主要 ...

  6. 2023年的深度学习入门指南(6) - 在你的电脑上运行大模型

    2023年的深度学习入门指南(6) - 在你的电脑上运行大模型 上一篇我们介绍了大模型的基础,自注意力机制以及其实现Transformer模块.因为Transformer被PyTorch和Tensor ...

  7. [TensorFlow深度学习入门]实战七·简便方法实现TensorFlow模型参数保存与加载(ckpt方式)

    [TensorFlow深度学习入门]实战七·简便方法实现TensorFlow模型参数保存与加载(ckpt方式) 个人网站–> http://www.yansongsong.cn TensorFl ...

  8. AI深度学习入门与实战21 文本分类:用 Bert 做出一个优秀的文本分类模型

    在上一讲,我们一同了解了文本分类(NLP)问题中的词向量表示,以及简单的基于 CNN 的文本分类算法 TextCNN.结合之前咱们学习的 TensorFlow 或者其他框架,相信你已经可以构建出一个属 ...

  9. 重磅! SLAM从入门到精通系统教程汇总

    3D视觉工坊相继推出了<透彻刨析室内.室外激光SLAM关键算法原理.代码与实战>.<激光-视觉-IMU-GPS融合SLAM算法:理论推导.代码讲解和实战>.<彻底搞懂基于 ...

  10. SLAM学习--视觉slam学习教材推荐(附相关技术文档下载链接)

    (理论上看完前三本,足够掌握视觉slam的所有理论知识,实践部分参考各种开源代码) 一.<视觉slam十四讲>,高翔,清华大学出版社,(目前已出第二版,优先推荐) 以上教材,其实是基于国外 ...

最新文章

  1. 使用Google 官方的控件SwipeRefreshLayout实现下拉刷新功能
  2. MPB:扬州大学王梦芝组-反刍动物瘤胃原虫18S rRNA测序分析技术
  3. MSDN-9月杂志推荐
  4. dubbo k8s 服务发现_服务化改造实践(二)| Dubbo + Kubernetes-阿里云开发者社区
  5. linux系统下cpu如何测试,Linux 系统下如何查看CPU个数
  6. Apple 的CEO 吹响了战斗的号角啦!
  7. nvm-windows 安装后,node 命令报错
  8. Java并发编程学习笔记(二)——对象的共享
  9. Python多人聊天室
  10. Java开发需要的官方文档
  11. 信捷PLC以太网连接编程软件
  12. IntelliJ IDEA主题选择
  13. 跨时空的相遇~为她制作一个专属的QQ空间相册(附源代码)
  14. Inspect(VB.NET、C#版)软件的的下载和使用
  15. 解决win10控制面板闪退问题
  16. 使用 Entrust 扩展包在 Laravel 5 中实现 RBAC 权限管理与安装配置
  17. 「TCG 规范解读」初识嵌入式和工业工作组
  18. 怎么样导包测试JavaWeb代码?
  19. 各行业不一样,WMS该如何入手?
  20. 惠普微波仪器的奠基人 硅谷首位华人工程師 - 邝达璇

热门文章

  1. A/Btest:组间的差异性检验,统计功效以及反选样本量,附python底层实现代码
  2. STM32F103ZET6【标准库函数开发】----- 04串口4的IO口收发数据实验测试
  3. python教你如何把自己的微信变成机器人
  4. Markdown 写文档做笔记的利器
  5. 感觉丧的时候,读一读曾国藩
  6. Leetcode刷题之二叉搜索树、平衡二叉搜索树3
  7. 使用ASF在Ubuntu下实现Steam云挂卡
  8. ESP8266最小系统
  9. 乔治城大学计算机科学专业,乔治城大学计算机系
  10. linux 中文ssid 显示,【两招解决网络设置 支持中文SSID】