当前位置: 首页 > news >正文

相机与相机模型(针孔/鱼眼/全景相机)

0. 摘要

本文旨在较为直观地介绍相机成像背后的数学模型,主要的章节组织如下:

  1. 第1章用最简单的针孔投影模型为例讲解一个三维点是如何映射到图像中的一个像素

  2. 第2章介绍除了针孔投影模型外其他一些经典投影模型,旨在让读者建立不同投影模型之间的建模过程

  3. 第3章介绍如何把不同的投影模型用一个统一的投影过程表达

  4. 第4章进一步补充第三章的统一投影模型,并介绍畸变的定义和去畸变的原理

  5. 第5章针对全景相机的基本概念和两种应用广泛的全景相机模型做出介绍

  6. 第5章用代码示例介绍如何使用OpenCV的接口对图像去畸变

1. 相机成像过程

为了具体说明相机的成像,可以以最简单的针孔相机成像来予以说明。

针孔相机由一面有小光圈的遮光盒和另一面有胶卷组成

由于研究中使用的大多数商用相机都是基于类似的结构,使用薄透镜、小孔径和光传感器代替胶片,因此在计算机图形学和计算机视觉研究中,针孔相机模型通常用于解释和建模图像形成。

说到图像的成像,就必须提到三个坐标系,相机坐标系、世界坐标系、图像坐标系

a)ICS:图像坐标系是附着在每个图像上的坐标系,用于指定像素位置。按照惯例,从观众的角

度来看,原点位于图像的左上角,x-指向右侧的轴,以及y-轴向下。

b) CCS:摄影机坐标系的原点附着到摄影机,计算机视觉约定使用带z的右手系统,那么z-指向相

机正在观察的对象的轴(指向相机的外侧和图像平面的内侧),y-指向下方的轴,x-轴向右。

需要注意,OpenCV使用的这种约定可能与计算机图形软件(如Blender,OpenGL)中使用的视图坐标系不同,后者使相机观察方向为负z坐标,同时y-是指向上方的轴。详见另外一篇技术博客透视投影与正交投影矩阵中图2所示。

对比OpenCV与OpenGL两种不同的坐标系,可知相应的转换矩阵

T_opencv2opengl = array([[ 1, 0, 0, 0], [ 0, -1, 0, 0], [ 0, 0, -1, 0], [ 0, 0, 0, 1]]) #对该矩阵求逆 T_inv = np.linalg.inv(T_opencv2opengl ) # 由此得到 T_opengl2opencv = T_inv = array([[ 1, 0, 0, 0], [ 0, -1, 0, 0], [ 0, 0, -1, 0], [ 0, 0, 0, 1]]) #也就是说该矩阵刚好自逆,从坐标系的差异也可以得到验证

c)WCS:世界坐标系将摄影机与场景中的其他对象相关联。

1.1 三维空间点映射到图片的像素

先从一个最简单的问题开始:一个三维空间中的点是如何经过相机成像变为图像上的一个像素的?

我们最常见的投影模型Perspective Projection Model描述的就是针孔相机的成像原理。从上面的图根据相似三角形可以得出:

其中为光轴在图像中的坐标,如果相机的光轴与感光元器件完全对齐的话,,是图像的宽度(单位是像素)。

从上面的关系可以得出,将一个三维点投影到像素坐标系的时候,可以直接使用下面的公式。对应的就是针孔相机模型。下标表示这个点是在相机坐标系下的点。

公式(1.2)在代码中也经常对分开进行计算:

​​​​​​​ ​​​​​​​ ​​​​​​​

当然,为了简化记号,公式(1.2)也通常记为矩阵相乘的形式:

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​

如果提前对做归一化处理,也就是除以(这里, 假设点位于相机前,即),则可以去掉系数,即如下形式:

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​

公式(1.5)中位于的平面,又叫归一化平面(nomalized plane),下文会再次提到。

公式(1.2)到公式(1.6)其实都是等价的。

如果给的三维点是在世界坐标系下,也就是,那么我们只需要先把该点用相机的外参转换到相机坐标系下(刚性变换)即可:

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​

由于刚性变换过程不影响对相机投影模型的讨论,因此后面都假设三维点是处于相机坐标系

1.2 相机坐标系

在OpenCV中及大部分视觉处理库中,相机坐标系的规定都与上述的图一致,就是相机光轴往前为,图像水平往右为,图像垂直往下为。不过要注意的是在一些仿真渲染器或者特定任务的数据集中可能会规定图像垂直往上为,前为,朝左为,但是这一点是无关紧要的,这一点差别可以反映在相机的外参里,也就是公式(1.7)中的,只要按照OpenCV的方式规定相机坐标系,总是可以找到一个外参矩阵将世界坐标系下的点变换到相机坐标系(前)。

1.3 小结

问:相机是如何成像的?答:光束从物体表面反射,经过相机镜头,到达感光原件,这一系列物理过程可以通过数学公式表达,最终变成一个简单的矩阵操作将三维空间中的点映射到图片的一个像素。具体来说,流程图如下:

一般来说,世界坐标系和像素坐标系通过一组物理坐标系相关联参数,具体如下:

* the focal length of the lens 透镜的焦距
* the size of the pixels 像素大小
* the position of the principal point 主点位置
* the position and orientation of the camera 相机的位置与姿态

2. 不同的相机投影模型

第一节介绍的是针孔投影模型,但是事实上相机镜头都是多种多样的,不可能都是符合针孔投影模型。本节会介绍经典的相机投影模型,并从直观感受和形式化定义上介绍不同的投影模型是如何联系在一起的。

2.1 什么是相机投影模型

相机投影模型用数学的方式描述了一个真实世界中的三维点到图像上像素坐标的映射关系。

相机投影模型实际上就是对相机成像过程(物理)的数学建模。建模的目的是为了能够尽量符合真实的成像过程。不同的建模方式就对应不同的相机投影模型。

2.2 经典的相机投影模型

我们回头看看公式(1.3),并暂时只关注轴的映射关系:

​​​​​​​ ​​​​​​​ ​​​​​​​

上式中称为相机焦距,反应了一个单位长度应该映射为几个像素,单位是是相机坐标系(以光轴点为原点)到图像坐标系(以左上角为原点),这两个参数都是相机的固有参数。而上式轴刚好是点到相机光心的连线与光轴角度的正切值,我们记光束与光轴的夹角为,并将图片原点移动到图片中心,则公式(1.3)可以写为:

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​

上式的示意图如下(图中的在只考虑轴的时候就是):

在公式(2.1)中,轴的投影坐标是的函数,于是,我们是否可以用不同的函数表达这个过程?答案是肯定的!不同的函数就对应了不同的投影模型。下图就给出了在经典投影模型中对的不同映射方式。

事实上,作为相机的焦距,在上图中的不同投影模型都统一出现,上图中不同的函数关系与投影模型的对应关系如下:

  • ,perspective projection/pinhole model/rectilinear model
  • , stereographic projection
  • , equidistant projection
  • ,sine-law projection
  • ,equi-solid angle projection

上面两幅图出自:Models for the various classical lens projections,这篇文章比较形象地介绍各种经典的相机投影模型,并给出他们的函数曲线分析。不过总体偏形象化,没有引入更形式化的描述。下面对几种常见的相机投影模型分别展开阐述。

a) 透视投影(perspective projection)

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​

针孔相机模型是经典的投影到平面的模型。每个3D点被映射到2D点。当 z 接近0时,该模型会失效,并且仅在180度视场范围内有效。针孔投影是唯一一个总是将物体空间中的直线映射到图像中的直线的模型。

这个模型的缺点是在更高的视场角度下会产生大量的畸变。我们越接近±90度的奇异点,就会有更多的拉伸。这使得它实际上不适用于视场角度大的镜头。

针孔/直角投影模型有时也被称为正切模型,因为投影点到图像中心的距离与入射光线角度的正切值成正比。

b)等距投影(Equidistant projection)

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​

通过等距投影,投影点与图像中心的距离与入射光线角度成正比。这意味着在z=0处没有奇点,理论上可以表示高达360度视场的透镜。在实践中,随着视场变大,物体看起来越来越压缩,尽管即使在高角度下这种效果也是适度的。

等距投影几何:距图像平面中心的距离与图中指示的弧长成正比

c)等立体角投影

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​

等立体角模型确保每个像素对应的投影面积在整个视场中是恒定的。该模型倾向于在约190度视场的大视场下过度压缩图像像素。适用于较为均匀的畸变分布。

等距投影几何:距图像平面中心的距离与图中所示的弦长成正比

d)立体投影(Stereographic projection)

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​

该模型首先投影到单位球体的表面上,然后使用针孔投影投影球体的表面。赤平投影模型倾向于在其视场范围内精确地表示物体形状。即使在高光线角度下,图像数据的压缩和拉伸也相对有限。用这种型号设计的镜片并不常见,但确实存在。下图说明了投影几何体。

立体投影几何:投影到单位球体,然后是以球体顶部为中心的针孔投影

e)正交投影(Orthographic projection)

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​

正交模型首先映射到一个单位球体上,然后垂直向下映射到如下图所示。该模型仅限于180度视场,并在硬限制之前将像素压缩到无法使用的程度。

正交投影几何:从欧氏相机模型单位球体到z=0平面的正交投影

f)增强型统一摄像头模型(EUCM:Enhanced unified camera model)

EUCM不对应于特定的物理透镜几何形状。事实上,它实际上是一个具有两个参数α,β的灵活投影函数家族。

它对针孔投影功能进行了小幅更改。不是通过除以z,而是除以一个归一化函数,这被证明是非常强大的,因为它让我们能够以最小的计算开销模拟许多不同的透镜几何。

EUCM投影几何:EUCM投影找到入射光线与给出的二次曲面的交点,然后垂直投影到图像平面。由参数化的二次曲面可以是直线、圆、抛物线或双曲线。

EUCM的归一化函数如下:

​​​​​​​

在此模型下,任意一个3D点被投影到,当,模型简化为针孔模型.

其他参数则生成不同的投影曲面,而不再是z=1平面。

当与畸变模型结合使用时,EUCM可以与许多不同的镜头一起使用,而无需知道确切的光学设计。下图显示了近似上述经典鱼眼投影的EUCM参数值。

EUCM近似图显示了每个标准投影的最接近的EUCM模型。EUCM可以精确地模拟针孔、立体和正交投影。它可以在视场内近似到接近260°的等距和等实体模型。注意,上图指的是整个视场角的1/2。

3. 相机投影模型的统一表达形式

上一节我们将投影关系限制在轴,并且给出了较为直观的图示。目的在于两个:

  • 1) 给读者建立更深刻的相机投影过程;
  • 2) 让读者对几种经典的投影模型有初步的直观了解。在这一小节中,我们给出更为统一的相机投影表达方式,同时为后文讨论相机的畸变建立必要的理论基础。

我们将相机的投影过程拆分为三个过程:

  • 1)将空间中的点投影到单位球表面;
  • 2)将单位球上的点投影到归一化平面;
  • 3)将归一化平面上的点利用针孔模型投影到图像坐标系。

下面内容将详细介绍这几个过程。

3.1 单位球投影

想象一下一束光束从相机光心射出,经过图像中的一个像素然后往外无限延伸,可以想象到,这个光束经过的任何点到图像的投影都是经过的那个像素。这个简单的事实告诉我们,我们可以对一个三维点进行任意的放缩,其在图像上的成像点都不会改变。于是,我们将三维点除以它自身的膜长,将其投影到一个单位球,其投影坐标为:

​​​​​​​ ​​​​​​​

示意图如下:

在上图中,是光束与光轴的夹角,为光束与水平轴的夹角。

两个角度有如下关系:

​​​​​​​ ​​​​​​​

之所以构建是因为我们后续可以将投影过程建立为这两个角度的函数,也就是只与光束的角度有关,而与具体的点坐标无关,这也是符合直观的。

另外,从前面的叙述以及常识,我们知道针孔成像结果是一个倒立的像,为了方便叙述,我们可以将相机做一个镜像,如下图所示:

这个单位球有时候又叫视球(Viewing Sphere)。

3.2 归一化平面与模型平面

将世界坐标系的点投影到单位球后,我们进一步将其映射到的平面上,这个平面又叫归一化平面(Normalized Plane)。此时不同的投影模型会对在归一化平面上的点到原点的连线做放缩,为了后文叙述的统一性,我们再拆分出一个模型平面。在归一化平面上的点只是与光心点的连线和平面的交点,即:

在模型平面上(Model Plane),对归一化平面上的点做半径放缩,即:

​​​​​​​ ​​​​​​​ ​​​​​​​

这两个平面的变换过程如下图所示

从第二节中经典的投影模型我们发现,其实不同的投影模型都没有对产生影响,而是对投影点到原点的距离建立不同的函数形式。

稍后将看到,为了能将所有模型都统一为针孔投影模型,会将模型平面变为畸变平面,用更具一般性的多项式代替前面的表达形式。(因此,现在模型平面上的点用下标标明,表示distortion)。

3.3 透视变换

得到模型平面上的坐标后,我们可以用相机内参将其变换到图像平面,这个步骤实际上就只是坐标的变换了。

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​

最后,我们可以得到一张完整地表达相机投影模型的示意图:

3.4 将针孔投影带入上述统一模型

我们可以将针孔模型,即代入上面的模型,联立公式(3-1)-(3-5),最后可以发现,公式(3-5)的结果其实就是公式(1-3),也就是针孔投影模型的公式。这个过程比较简单,就不再展开公式。读者自己推导一下这个过程非常有利于理解上述的过程。

参考上图所示,对于相机坐标系下位于平面上的点,

3.5 不同投影模型的函数图

我们可以将不同的经典投影模型的函数画出来(横轴为,纵轴为),结果如下:

从上图我们应该至少要观察到一个重要的事实:针孔模型在θ → 90°时数学发散,工程可勉强用到120°~140°,但精度极差,不推荐。实际上,从上面的函数图可以看到,针孔投影模型只能在大约水平140度以内的视野成像。

3.6 相机投影模型总结

到目前位置,我们应该建立至少以下几个方面的认识:

  1. 统一化的投影模型经过:单位球投影->归一化平面->透视变换几个过程,将一个三维点投影到图像上的像素

  2. 不同的经典投影模型在投影过程中不会改变光束与轴的夹角,只是对像素到图像原点的距离建立不同的方程

4. 相机的畸变

4.1 针孔模型的优越性

首先描述一下我们人类直观上对于“标准的图像”这个词的一个感性认识,是不是我们会觉得横平竖直,真实中是直线则图像中也是直线,这样的图片会比较“标准”?事实上,针孔投影模型就刚好具有这样的性质。这个性质也可以从其投影方程看出来。经过针孔成像的物体,好像就是把整个物体缩小放在图片上,因此圆是圆,直线是直线。而其他投影模型就可能会呈现膨胀、紧缩的成像效果。如下图所示:

4.2 畸变定义

“畸变”这个词从词语上应该理解成由于镜头加工等因素造成镜头与投影模型的差异。但实际上,

畸变,描述的是镜头实际成像 与 理想投影模型(等距/等立体角等)之间的偏差。鱼眼画面的弯曲是投影几何特性,不属于畸变。通常简化的鱼眼投影模型就是等轴投影+4阶多项式径向畸变。

而“去畸变”则是使用畸变模型对图像进行逆操作,使得图像就像用理想投影模型成像出来的一样。

4.3 在归一化平面插入畸变模型

为了能够利用针孔模型的性质,我们在前文给出的统一相机投影模型中将模型平面用畸变平面代替。这里的核心思想是,用一个更具一般性的多项式替代各个投影模型中的模型函数,以此达到用一个方程表达多个投影模型的目的。

替换后的示意图如图所示:

注意上图与上一节最后的统一投影模型其实是一样的,不过Model Plane名字换成Distortion Plane

我们这一节采用OpenCV实现的畸变模型来讲解畸变过程

我们还是先将点投影到归一化平面得到,并令其到原点的半径为:

4.4 针孔相机径向畸变(Radial Distortion)

所谓的径向畸变(Radial Distortion)就是指只对点做半径上的伸缩变化,这一点其实就跟经典投影模型一样用一个函数建立半径的变化,在OpenCV中,标准镜头的径向畸变可以用如下方程表达,此时​为无畸变后的归一化平面坐标,为畸变后的归一化坐标,径向畸变可表示为:

​​​​​​​ ​​​​​​​

径向畸变对于环绕光轴一周的改变是一致的,因此也叫做半径对称畸变(Radial Symmetric Distortion)或者畸变的对称部分(Symmetric Part Of Distortion Model)

其中,

​​​​​​​ ​​​​​​​

  • 是归一化坐标到归一化平面中心点(光轴)的距离平方。
  • 是径向畸变系数(通常取前2或3项即可)。

根据畸变后的归一化坐标得到像素坐标: ​​​​​​​ ​​​​​​​

4.5 针孔相机切向畸变(Tangential Distortion)

真实的镜头由于加工误差和安装误差,会导致镜头与感光原件的中心不是完全对齐的,因此在平行的方向上会与标准的针孔成像模型有差异,这种差异对于光轴不是旋转对称的,也叫做切向畸变(Tangential Distortion)

OpenCV中镜头的切向畸变方程如下:

​​​​​​​ ​​​​​​​

公式(4.2)和公式(4.5)中的叫做畸变参数(Distortion Coefficients)。

另外一种考虑薄棱镜畸变参数的 完整畸变模型 如下:

4.6 鱼眼相机的畸变

下面示意图如下,注意图中对应的未发生畸变的

​​​​​​​ ​​​​​​​

根据图中关系式,可知满足:

对应的发生畸变的,考虑畸变模型,(注意这里三点共线)

由此根据畸变后的归一化坐标得到畸变点的像素pixel坐标

如果改为鱼眼相机等轴投影模型,此时如果无畸变时,图像平面径向距离与入射角严格满足

成像时用畸变等效角​代替真实角代入等距投影公式:

​​​​​​​ ​​​​​​​ ​​​​​​​

4.7 去畸变

有了畸变模型之后,我们就可以将一个三维点经过:单位球投影->归一化平面投影->畸变模型->透视变换,得到该点在图像中的像素位置。我们可以通过一些标定物,经过求解得到上述的畸变系数,进而得到畸变过程的反过程。我们将图像上的点先经过透视变换的反变换得到在畸变平面上的点,再经过畸变过程的反过程,再投回图像中,这样我们就得到一副没有畸变的图像,其看起来就像是用完全标准的针孔投影模型成像的照片。

下面的图片展示了从畸变到去畸变的图像变化

做完去畸变后,整个的成像过程就像直接用针孔投影模型(公式1-3)成像一般,就像下图一样。

提出畸变模型的文章需要给出如何标定出畸变参数,同时如何计算从畸变点到非畸变点,这里面主要是一些数学求解,这里就不展开讨论,有兴趣的可以看看wiki:Distortion

5. 全景相机(Omidirectional Camera)

行业内通常鱼眼成像 fov≥180°,所谓的全景相机广泛概念上指成像 fov ≥360°的相机,他们看起来大概像是下图所示:

从第二节(不同的相机投影模型)我们可以知道,针孔模型在光线趋近 90° 时数学映射趋于无穷大;工程中可强行用于 120°~130° 大广角,但线性成像假设失效,畸变拟合效果极差,不推荐使用。通常由于进光量等问题,这类相机一般最多只有140度左右的成像视野。

一般的畸变模型的设计以针孔相机模型为基础,通过参数模型修正真实的成像与针孔成像的差异,因为在很多的应用中我们希望能够通过“去畸变”的方式,将图片变成“直线还是直线(Straight lines are straight),在KannalaBrandt论文中是这样描述的:

It is impossible to project the hemispherical field of view on a finite image plane by a perspective projection so fish-eye lenses are designed to obey some other projection model.This is the reason why the inherent distortion of a fish-eye lens should not be considered only as a deviation from the pinhole model

于是,就有很多专门针对全景相机(Omidirection Camera/Fisheye Camera/Wide-Angle camera)的建模研究出现。

重新理清一下我们的目的:

  1. 拥有一种统一的表达方式能够尽量拟合真实的全景相机的成像过程

  2. 这种表达方式应该简洁有效

  3. 能够对模型的参数求解,并将图像通过“去畸变”变成像是由针孔相机拍摄出来的横平竖直的图像

OpenCV中针对全景相机的标定和去畸变给出了两种实现

  1. KannalaBrandt模型.对应实现OpenCV::Fisheye

  2. CMei模型. 对应实现OpenCV::Omnidir

下面简单介绍这两种模型

5.1 KannalaBrandt模型

第一步还是先将点投影到单位球模型,这样我们就得出了两个角度,后续的畸变模型就是关于这两个角度的函数

这里这里摘录OpenCV的描述方式OpenCV_Fisheye,相比于论文,在模型参数上简化了很多

KannalaBrandt模型使用一个多项式描述径向畸变(畸变的对称部分):

​​​​​​​ ​​​​​​​ ​​​​​​​

径向畸变后坐标变为:

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​

最后再进行非对称畸变:

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​

最后再经过公式(3.5)变换到图像坐标系。

5.2 CMei模型

CMei模型相比于其他模型有一个较大不同之处在于在从单位球投影到归一化平面时将相机光心往后移动了距离,总体的投影过程如下图:

上图出自引用CMei的一篇论文:Design and Calibration of an Omni-RGB+D Camera。

6. 代码实例

6.1 针孔投影模型去畸变实例

# undistort image h, w = img.shape[:2] newcameramtx, roi = cv2.getOptimalNewCameraMatrix(K, distortions, (w,h), alpha, (w,h)) undistorted_img = cv2.undistort(img, K, distortions, None, newcameramtx) x, y, w, h = roi undistorted_img = undistorted_img[y:y+h, x:x+w] # undistort image points if points2d.ndim == 2: points2d = points2d[:, None, :] undistorted_points = cv2.undistortPoints(points2d, K, distortions, P=K) undistorted_points = undistorted_points.reshape(-1, 2)

6.2 CMei模型去畸变实例

# undistort image if newK: K_new = np.zeros((3,3), np.float64) h,w = img.shape[:2] K_new[0, 0] = w/4 K_new[0, 2] = w/2 K_new[1, 1] = h/4 K_new[1, 2] = h/2 K_new[2, 2] = 1.0 else: K_new = None undistorted_img = cv2.omnidir.undistortImage( img, K, distortions, Xi, cv2.omnidir.RECTIFY_PERSPECTIVE, Knew=K_new) # undistort image points if points2d.ndim == 2: points2d = points2d[:, None, :] undistorted_points = cv2.omnidir.undistortPoints(points2d, K, distortions, Xi, None) undistorted_points = undistorted_points.squeeze() f0 = K_new[0,0] f1 = K_new[1,1] c0 = K_new[0,2] c1 = K_new[1,2] undistorted_points[:, 0] = f0* undistorted_points[:, 0] + c0 undistorted_points[:, 1] = f1 * undistorted_points[:, 1] + c1

PS:cv2::omnidir::undisortPoints的旧版本有bug,参考这个issue。omnidir空间目前还没有成为opencv的正式稳定接口,因此维护在opencv-contrib-python包中,最新的包(4.6.x)已经修复了bug。一定要检查一下是不是有那个bug!!!!

6.3 KannalaBrandt模型去畸变实例

# You should replace these 3 lines with the output in calibration step DIM=XXX K=np.array(YYY) D=np.array(ZZZ) def undistort(img_path): img = cv2.imread(img_path) h,w = img.shape[:2] map1, map2 = cv2.fisheye.initUndistortRectifyMap(K, D, np.eye(3), K, DIM, cv2.CV_16SC2) undistorted_img = cv2.remap(img, map1, map2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT) cv2.imshow("undistorted", undistorted_img) cv2.waitKey(0) cv2.destroyAllWindows() if __name__ == '__main__': for p in sys.argv[1:]: undistort(p)

7. 相机标定方法

最经典的是使用张正友标定法,可参考另外一篇博客内容。

8. 参考资料

  1. OpenCV:Camera Calibration

  2. OpenCV2.4:Camera Calibration

  3. Models for the various classical lens projections

  4. Wiki:Distortion

  5. KannalaBrandt:A Generic Camera Model and Calibration Method for Conventional, Wide-Angle, and Fish-Eye Lenses

  6. CMei: Single View Point Omnidirectional Camera Calibration from Planar Grids

  7. Fisheye camera calibration

  8. OpenCV::Fisheye

  9. OpenCV::Omnidir

  10. Camera Models Summary - CGABC

  11. https://www.skiprobotics.com/articles/fisheye-calibration/

  12. 相机标定之畸变矫正与反畸变计算

http://www.jsqmd.com/news/882058/

相关文章:

  • 别再手动刷地形了!用Unity Gaia插件5分钟搞定开放世界基础地形(含World Designer工作流)
  • 如何高效处理大型AI模型:ONNX外部数据实战指南
  • 机器学习在糖尿病并发症预测中的应用:逻辑回归、SVM与随机森林对比实践
  • 强化学习驱动的量子架构搜索:自动化设计高效量子机器学习电路
  • 动态临床轨迹整合:Cox与随机生存森林在肺癌预后预测中的实践对比
  • HHEML:基于FPGA硬件加速的边缘隐私保护机器学习框架
  • AutoQML:自动化量子机器学习框架的工程实践与性能分析
  • 基于3D-UNet与描述符分析的低分辨率CT复合材料微结构定量解析
  • 机器学习与可解释AI预测生活满意度:从数据清洗到模型部署全解析
  • 基于深度学习的亚分钟级光学瞬变事件自动发现与天体物理分析
  • 构建全栈可解释AI框架:从数据到决策的透明化实践
  • LLM安全防御:Prompt Injection与Jailbreak攻击检测技术解析
  • 基于InfoVAE的类星体光谱生成与潜在空间物理关联探索
  • 基于强化学习的量子传感器电路优化:多目标权衡与工程实践
  • 为什么你需要一个独立的PCK文件处理工具?3个自动化工作流解析
  • 基于SVM与SHAP的金融市场拐点预测:模型构建、可解释性与稳健性评估
  • 量子增强脑电解码:QEEGNet混合架构的设计、实现与评估
  • CNN驱动稀土铬酸盐性能预测:从单元素掺杂到高熵材料设计
  • Unity FPS新手引导框架:事件驱动与状态感知的实时引导系统
  • 能源预测实战:ELM与LSTM在效率与精度上的深度对比
  • 基于多头自注意力机制的CICY流形自由商检测模型设计与实现
  • Token CSS PostCSS插件使用指南:无缝集成现有工作流
  • 数据科学揭秘椭圆曲线秩分布:BSD参数空间的拓扑结构探索
  • MAA明日方舟助手:从零开始的智能自动化完整指南
  • 无Root安卓隐私检测:Frida+Camille实战指南
  • FanControl终极指南:5分钟让你的Windows风扇控制说中文,免费实现精准散热管理
  • ARM SVE向量表查找指令TBL/TBX详解与应用
  • 用Python和MNE库搞定BCI Competition IV 2a数据集:从.gdf文件读取到四分类运动想象数据提取全流程
  • JunoBench:首个机器学习Jupyter Notebook崩溃基准数据集
  • Hindsight核心概念解析:Retain、Recall、Reflect三大操作详解