目录

  • 0 拍照的死亡角度
  • 1 透视相机模型
  • 2 相机矩阵
  • 3 镜头畸变

0 拍照的死亡角度

拍照死亡角度一般指的是将自己脸盆子拍得特别大,拍出用鼻孔看人的狰狞面目,比如下面这张照片。在拍照的死亡角度下,镜头畸变会产生失真,让你的体态更圆润、厚实,因此部分美颜软件里人像修正中会有“去畸变”这一项功能。本文就从计算机视觉的角度谈一谈镜头畸变原理。

1 透视相机模型

透视相机模型描述了三维空间中的点与二维图像平面上像素间的映射关系

根据小孔成像原理,透视相机的成像点与空间点之间方向相反,如图所示。为得到与空间点方向相同的成像点,将成像面沿着光轴移动到归一化成像面,接下来的讨论以归一化成像面为准。


在确定归一化成像面后,从空间点W⁣X~^W\!\tilde{X}WX~到像素点u~\tilde{u}u~的映射可分为两步:

  1. 将W⁣X~^W\!\tilde{X}WX~映射到归一化成像面的成像点C⁣x~^C\!\tilde{x}Cx~,对应的映射关系称为相机外参(Extrinsic)
  2. 将C⁣x~^C\!\tilde{x}Cx~映射到像素平面的像素u~\tilde{u}u~,对应的映射关系称为相机内参(Intrinsic)。上述各点均处于投影空间,采用齐次坐标。

2 相机矩阵

设世界坐标系{W}\left\{ \boldsymbol{W} \right\}{W}相对于透视相机坐标系{C}\left\{ \boldsymbol{C} \right\}{C}的位姿为

WC⁣T=[WC⁣ ⁣ ⁣RC⁣pw001]_{\boldsymbol{W}}^{\boldsymbol{C}}\!\boldsymbol{T}=\left[ \begin{matrix} _{\boldsymbol{W}}^{\boldsymbol{C}}\;\!\!\!\boldsymbol{R}& ^{\boldsymbol{C}}\!\boldsymbol{p}_{w_0}\\ 0& 1\\\end{matrix} \right]WC​T=[WC​R0​Cpw0​​1​]

考虑到从三维空间降维到二维平面,设世界坐标值[W⁣⁣XW⁣⁣ ⁣  ⁣ YW⁣⁣Z1]T\left[ \begin{matrix} ^{\boldsymbol{W}\!}\!X& ^{\boldsymbol{W}\!}\!\!\:\!\:Y& ^{\boldsymbol{W}\!}\!Z& 1\\\end{matrix} \right] ^T[WX​WY​WZ​1​]T,则

C⁣x~=[100001000010],WC⁣TW⁣ ⁣X~=[C⁣XCYC⁣Z]^{\boldsymbol{C}}\!\tilde{x}=\left[ \begin{matrix} 1& 0& 0& 0\\ 0& 1& 0& 0\\ 0& 0& 1& 0\\\end{matrix} \right] {\color{white} ,}_{\boldsymbol{W}}^{\boldsymbol{C}}\!\boldsymbol{T}^{\,\,\boldsymbol{W}}\!\!\tilde{X}=\left[ \begin{array}{c} ^{\boldsymbol{C}}\!X\\ ^{\boldsymbol{C}}Y\\ ^{\boldsymbol{C}}\!Z\\\end{array} \right]Cx~=⎣⎡​100​010​001​000​⎦⎤​,WC​TWX~=⎣⎡​CXCYCZ​⎦⎤​

在上述推导过程中,称

ME=[100001000010],WC⁣T=[WC⁣ ⁣ ⁣RC⁣pw0]\boldsymbol{M}_{\boldsymbol{E}}=\left[ \begin{matrix} 1& 0& 0& 0\\ 0& 1& 0& 0\\ 0& 0& 1& 0\\\end{matrix} \right] {\color{white} ,}_{\boldsymbol{W}}^{\boldsymbol{C}}\!\boldsymbol{T}=\left[ \begin{matrix} _{\boldsymbol{W}}^{\boldsymbol{C}}\;\!\!\!\boldsymbol{R}& ^{\boldsymbol{C}}\!\boldsymbol{p}_{w_0}\\\end{matrix} \right]ME​=⎣⎡​100​010​001​000​⎦⎤​,WC​T=[WC​R​Cpw0​​​]

相机外参矩阵。通常令尺度因子C⁣Z=1^{\boldsymbol{C}}\!Z=1CZ=1,C⁣x~=[C⁣XC⁣ZCYC⁣Z1]T=[C⁣x^C⁣y^1]T^{\boldsymbol{C}}\!\tilde{x}=\left[ \begin{matrix} \frac{^{\boldsymbol{C}}\!X}{^{\boldsymbol{C}}\!Z}& \frac{^{\boldsymbol{C}}Y}{^{\boldsymbol{C}}\!Z}& 1\\\end{matrix} \right] ^T=\left[ \begin{matrix} ^{\boldsymbol{C}}\!\hat{x}& ^{\boldsymbol{C}}\!\hat{y}& 1\\\end{matrix} \right] ^TCx~=[CZCX​​CZCY​​1​]T=[Cx^​Cy^​​1​]T

从C⁣x~^C\!\tilde{x}Cx~到像素u~\tilde{u}u~的映射用三维内参矩阵KKK来表示,即

u~=KC⁣x~=[fuscu0fvcv001]C⁣x~\tilde{u}=\boldsymbol{K}^C\!\tilde{x}=\left[ \begin{matrix} f_u& s& c_u\\ 0& f_v& c_v\\ 0& 0& 1\\\end{matrix} \right] \,\,^C\!\tilde{x}u~=KCx~=⎣⎡​fu​00​sfv​0​cu​cv​1​⎦⎤​Cx~

其中

  • 如图(a)所示,参数cuc_ucu​、cvc_vcv​用于中心映射——将光轴与归一化成像面的交点,即成像面中心点映射到像素平面中心,其取决于拜耳阵列与光轴如何对齐。
  • 如图(b)所示,参数fuf_ufu​、fvf_vfv​用于归一化——将矩形的传感器阵列映射为正方形
  • 如图©所示,参数sss用于正交化——当传感器阵列不正交或传感器平面与光轴不垂直时,需要引入 纠正畸变。

3 镜头畸变

上述透视相机模型基于针孔无限小的假设,但在现实中,光线通过镜头将使相机内部复杂化,产生明显的径向失真——场景中的线条在图像中显示为曲线。径向畸变(Radial Distortion)有两种类型:

  • 筒体畸变(Barrel Distortion)
  • 枕形失真(Pincushion Distortion)

此外由于相机组装过程中,透镜不能和成像面严格平行,会引入切向畸变(Tangential Distortion)


针对具有镜头畸变的相机,不能直接应用透视相机模型,通常需要先通过多项式模型修正这种几何偏差,即:

{x^=x(1+κ1r2+κ2r4)+2p1xy+p2(r2+2x2)y^=y(1+κ1r2+κ2r4)+p1(r2+2y2)+2p2xy\begin{cases} \hat{x}=x\left( 1+\kappa _1r^2+\kappa _2r^4 \right) +2p_1xy+p_2\left( r^2+2x^2 \right)\\ \hat{y}=y\left( 1+\kappa _1r^2+\kappa _2r^4 \right) +p_1\left( r^2+2y^2 \right) +2p_2xy\\\end{cases}{x^=x(1+κ1​r2+κ2​r4)+2p1​xy+p2​(r2+2x2)y^​=y(1+κ1​r2+κ2​r4)+p1​(r2+2y2)+2p2​xy​

其中r2=x2+y2r^2=x^2+y^2r2=x2+y2,κ1\kappa _1κ1​、κ2\kappa _2κ2​称为径向畸变参数,p1p_1p1​、p2p_2p2​称为切向畸变参数; (x,y)(x,y)(x,y)为畸变坐标,(x^,y^)\left( \hat{x},\hat{y} \right)(x^,y^​)为无畸变坐标。


计算机视觉教程0-3:为何拍照会有死亡视角?详解相机矩阵与畸变相关推荐

  1. [python opencv 计算机视觉零基础到实战] 四、了解色彩空间及其详解

    一.学习目标 了解什么是色彩空间 了解opencv中色彩空间的转换 目录 [python opencv 计算机视觉零基础到实战] 一.opencv的helloworld [[python opencv ...

  2. vue设置html自动跳转路由器,vue2.0项目实现路由跳转的方法详解

    一.安装 1.安装路由vue-router: npm install vue-router vue项目的依赖文件node_modules存在vue-router依赖,说明安装成功 2.vue项目引入v ...

  3. Linux Shell脚本入门教程系列之(八)Shell printf命令详解

    本文是Linux Shell脚本系列教程的第(八)篇,更多shell教程请看:Linux Shell脚本系列教程 在上一篇:Linux Shell系列教程之(七)Shell输出这篇文章中,已经对She ...

  4. 汇川小型PLC梯形图编程系列教程(七):数值存储与二进制数据知识详解

    原文链接:汇川小型PLC梯形图编程系列教程(七):数值存储与二进制数据知识详解 PLC数据存储原理简介 H123U小型PLC内部采用的是32位的处理器,PLC中的数据处理和电脑中的数据处理基本是一致的 ...

  5. Android基础入门教程——8.3.1 三个绘图工具类详解

    Android基础入门教程--8.3.1 三个绘图工具类详解 标签(空格分隔): Android基础入门教程 本节引言: 上两小节我们学习了Drawable以及Bitmap,都是加载好图片的,而本节我 ...

  6. 用Advanced Installer制作DotNetBar for Windows Forms 12.0.0.1_冰河之刃重打包版详解

    关于 DotNetBar for Windows Forms 12.0.0.1_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版-------------- ...

  7. Redis系列教程(六):Redis缓存和MySQL数据一致性方案详解

    需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...

  8. 华娱水浒无双1java,魔兽争霸3真水浒无双1.0正式版开局单刷完美通关图文详解

    魔兽争霸3真水浒无双1.0正式版开局单刷怎么打?有什么技巧?很多玩家可能还不太清楚,下面小编为大家带来了魔兽争霸3真水浒无双1.0正式版开局单刷完美通关图文详解,感兴趣的玩家一起来看看吧! 魔兽争霸3 ...

  9. 影视解说短视频制作教程:关于如何写文案和配音的详解

    影视解说短视频制作教程:关于如何写文案和配音的详解 影视解说短视频仍旧是非常受欢迎的,很多不知道应该看什么剧的小伙伴们都非常喜欢先看相关的影视解说短视频,如果感觉内容还不错,就会找原版来看看.那么,这 ...

  10. nps内网穿透服务器搭建教程(ip显示阿里云的ip)-小宇特详解

    nps内网穿透服务器搭建教程(ip显示阿里云的ip)-小宇特详解 一共有两部分,一部分是windows安装,一部分是linux系统(使得ip显示自己的阿里云). 前期准备 1.一台云服务器 2.配置安 ...

最新文章

  1. 设置oracle服务自动启动
  2. 如何找同服务器下网站,利用bing查询同一服务器IP下的所有网站
  3. luogu P3796【模板】AC自动机(加强版)
  4. Oracle查询优化-07日期运算
  5. Android Studio 点击运行总是debug
  6. DL框架之Tensorflow:深度学习框架Tensorflow的简介、安装、使用方法之详细攻略
  7. 动态规划 NOIP经典问题 开心的金明(洛谷P1060题题解,Java语言描述)
  8. (九)演员-评论员算法
  9. 内参、外参、畸变参数三种参数与相机的标定方法与相机坐标系的理解
  10. c替代if else_答应我,别再if/else走天下了可以吗
  11. win7 或 win10系统开机启动项设置
  12. day4:非参数统计及其检验方法(无sas代码)
  13. 单线、双线、三线以及BGP线路有什么区别?
  14. 模拟电子技术基础简明课程(第三版)思维导图
  15. 简洁商业计划书PPT模板
  16. 三、经典比特与量子比特
  17. PostgreSQL 配置文件 postgresql.conf 及 postgresql.auto.conf
  18. LogLoss的公式演化
  19. 纯纯的爬虫知识,python scrapy 下载中间件知多少
  20. 计算机组成原理微控制设计实验总结,计算机组成原理微程序控制器实验报告.doc...

热门文章

  1. 简易天线增益测量系统
  2. java上传文件服务器_java 实现文件上传到另一台服务器
  3. 如何用python合并文本文档_如何利用python合并文本
  4. -2. JavaScript Methods
  5. 使用java做地图_在地图中使用Java
  6. AlphaGo开源代码
  7. watir 基础知识
  8. unrealengine(UE5)虚幻引擎下载安装
  9. mitmproxy+python
  10. 架构师的“功夫在诗外”之二