相机校准—外参矩阵

这篇具有很好参考价值的文章主要介绍了相机校准—外参矩阵。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

相机校准—外参矩阵

在本文中,我们将探讨摄影机的外参,并通过Python中的一个实践示例来加强我们的理解。

相机外参

摄像头可以位于世界任何地方,并且可以指向任何方向。我们想从摄像机的角度来观察世界上的物体,这种从世界坐标系到摄像机坐标系的转换被称为摄像机外参。

相机校准—外参矩阵

那么,我们怎样才能找到相机外参呢?一旦我们弄清楚相机是如何变换的,我们就可以找到从世界坐标系到相机坐标系的基变换的变化。我们将详细探讨这个想法。

具体来说,我们需要知道相机是如何定位的,以及它在世界空间中的位置,有两种转换可以帮助我们:

  • 有助于确定摄影机方向的旋转变换。

  • 有助于移动相机的平移变换。

让我们详细看看每一个。

旋转

通过旋转改变坐标

让我们看一下将点旋转一个角度的变换。让我们举一个在ℝ²的简单例子,对点𝑃逆时针旋转角度𝜃 得到点𝑃′, 如下图所示:

相机校准—外参矩阵

𝑃的坐标是(𝑥,𝑦) 以及𝑃′的坐标是(𝑥′,𝑦′). 我们需要找到(𝑥′,𝑦′).

从图来看,
      sinα = y/r , cosα = x/r − [1]
⟹    xsinα = ycosα − [2]
同样的, x′ = rcos(θ+α)
⟹    x′ = (x/cosα) ∗ cos(θ+α) (from [1])
但,  cos(θ+α) = cosθcosα − sinθsinα
⟹    x′ = (x/cosα) ∗ (cosθcosα − sinθsinα)
⟹    x′ = xcosθ − xsinα ∗ (sinθ / cosα)
⟹    x′ = xcosθ − ycosα ∗ (sinθ / cosα) (from [2])
⟹    x′ = xcosθ − ysinθ

同样地,
      y′ = rsin(θ+α)
⟹    y′ = (y/sinα) ∗ sin(θ+α) (from [1])
但,  sin(θ+α) = sinθcosα + cosθsinα
⟹    y′ = (y/sinα) ∗ (sinθcosα + cosθsinα)
⟹    y′ = ycosθ + ycosα ∗ (sinθ / sinα)
⟹    y′ = ycosθ + xsinα ∗ (sinθ / sinα) (from [2])
⟹    y′ = ycosθ + xsinθ
⟹    y′ = xsinθ + ycosθ

因此我们有,
      x′ = xcosθ − ysinθ
      y′ = xsinθ + ycosθ

旋转是一种线性运算,上述方程可以表示为矩阵乘法:

相机校准—外参矩阵

这个操作是一个线性变换。

扩展到R3

我们可以很容易地将旋转变换扩展到𝐑³. 旋转的变换矩阵𝐑关于标准X轴、Y轴和Z轴,如下所示:

绕Z轴旋转:

相机校准—外参矩阵

绕X轴旋转:

相机校准—外参矩阵

绕Y轴旋转:

相机校准—外参矩阵

内参旋转与外参旋转

上述变换围绕标准轴执行旋转。轴将随时固定。这就是所谓的外参旋转。还有另一种类型的旋转称为内参旋转,我们在每一步都围绕其相对轴旋转对象,如下所示:

相机校准—外参矩阵

内参旋转很难用欧几里德代数来实现,我们将坚持外参旋转。

基变换

在基变换中,我们的目标是在新的基上找到点的坐标。

在下面的示例中𝑋𝑌 轴已经旋转了一个角度𝜃 得到𝑋′𝑌′. 给定在原有XY轴下点𝑃的坐标 , 我们的目标是找到在新轴𝑋′𝑌′下点𝑃的坐标 .

相机校准—外参矩阵

XY下点P的坐标是(x,y) ,新轴X'Y'下是(𝑥′, 𝑦′). 我们的目标是找到(𝑥′, 𝑦′).

从这个图来看,
      sinα = y′/r , cosα = x′/r − [1]
⟹    x′sinα = y′cosα − [2]
同样, x = rcos(θ+α)
⟹    x = (x′/cosα) ∗ cos(θ+α) (from [1])
但,  cos(θ+α) = cosθcosα − sinθsinα
⟹    x = (x′ / cosα) ∗ (cosθcosα − sinθsinα)
⟹    x = x′cosθ − xsinα ∗ (sinθ / cosα)
⟹    x = x′cosθ − y′cosα ∗ (sinθ / cosα) (from [2])
⟹    x = x′cosθ − y′sinθ

同样地,
      y = rsin(θ+α)
⟹    y = (y′/sinα) ∗ sin(θ+α) (from [1])
但,  sin(θ+α) = sinθcosα + cosθsinα
⟹    y = (y′/sinα) ∗ (sinθcosα + cosθsinα)
⟹    y = y′cosθ + y′cosα ∗ (sinθ / sinα)
⟹    y = y′cosθ + x′sinα ∗ (sinθ / sinα) (from [2])
⟹    y = y′cosθ + x′sinθ
⟹    y = x′sinθ + y′cosθ

因此我们有,
      x = x′cosθ − y′sinθ
      y = x′sinθ + y′cosθ

上述方程式可以矩阵形式表示为:

相机校准—外参矩阵

我们的目标是找到(𝑥′,𝑦′). 因此,我们将矩阵移到另一侧,取其逆:

相机校准—外参矩阵

理解线性变换和基变换变化之间的区别非常重要。

接下来我们将看到这两种转换是如何关联的。

线性变换与基变换的关系

如果你观察,基矩阵的变化是线性变换矩阵的逆。这意味着,如果我们知道摄像机变换矩阵,即在世界上负责旋转和移动摄像机的矩阵,我们可以取其逆矩阵,这可以帮助我们找到摄像机上点的坐标。

平移

通过平移改变坐标

平移的想法很简单——只要有一点𝑃, 我们移动它一个偏移量来得到点𝑃′ 如下图所示:

相机校准—外参矩阵

在这里,我们移动点𝑃 坐标(𝑥, 𝑦) ,偏移量为(−𝑎, 𝑏) ,得到点𝑃′ (𝑥′, 𝑦′).。我们的目标是找到(𝑥′, 𝑦′).

从这个图来看,
      x′ = x - a
      y′ = y + b

我们不能将上述方程表示为矩阵乘法——至少不能用它们当前的表示形式。

诀窍是增加一个额外的维度,然后我们可以将平移表示为线性变换,如下所示:

相机校准—外参矩阵

用额外维度表示的坐标称为齐次坐标。

为了从齐次坐标中得到欧几里德坐标,我们只需除以最后一个元素,如下所示:

[x, y, 1] ≅ [x/1, y/1] = [x, y]

通常,我们在齐次空间中执行所有操作,因为这很容易处理,最后,当我们完成时,我们转换回欧几里德空间。稍后我们将看到更多细节。

通过平移改变基

就像我们之前看到的,在基变换的变化中,我们变换轴而不是点。在下面的示例中,我们移动𝑋𝑌 坐标轴偏移以获得𝑋′𝑌′. 我们的目标是找到𝑋′𝑌′下的点𝑃的坐标.

相机校准—外参矩阵

旧轴XY下P的坐标是(x,y),新轴𝑋′𝑌′ 下P的坐标(𝑥′,𝑦′). 这里的偏移量是(𝑎, 𝑏).

从图上看,
      x′ = x - a
      y′ = y - b

同样,为了将上述方程表示为矩阵乘法,我们使用齐次坐标:

相机校准—外参矩阵

即使在平移中,线性变换和基变换的变化也是相反的。

摄像机外参矩阵

我们分别研究了旋转和平移;然而,我们可以使用如下所示的矩阵组合一次性执行这两个操作:

相机校准—外参矩阵

在这里𝑅 是旋转矩阵,形状是(3,3)和𝑂 是偏移量矩阵,形状是(3,1)。

通过求最终变换矩阵的逆,可以得到基矩阵的变化。我们称这个矩阵是摄像机外参矩阵E,形状是(4,4)

使用𝐸, 我们可以找到相机上任何一点的坐标。

相机校准—外参矩阵

自由度

相机外参矩阵自由度是6。三个旋转角度和沿X、Y、Z轴的三个偏移。

简化矩阵

我们可以看到相机外参矩阵的最后一行是0和1。它不会给转换增加任何价值,它的唯一目的是增加一个额外的维度——这意味着,正如我们将在下面的示例中看到的,我们可以删除最后一行。

实例

我们举一个实际操作的例子!

设置

包含所有代码的GitHub存储库可以在这里找到。

https://github.com/wingedrasengan927/Image-formation-and-camera-calibration

可以通过运行以下命令来设置环境:

# create a virtual environment in anaconda
conda create -n camera-calibration-python python=3.6 anaconda
conda activate camera-calibration-python

# clone the repository and install dependencies
git clone https://github.com/wingedrasengan927/Image-formation-and-camera-calibration.git
cd Image-formation-and-camera-calibration
pip install -r requirements.txt

注意:这假设你已经安装了anaconda。

我们将使用两个主要的库:

  • pytransform3d:这个库进行三维空间中的可视化和转换。

  • ipympl:它使matplotlib绘图具有交互性。

实例直觉

在本例中,我们将首先创建旋转和平移的变换矩阵,将它们组合成一个矩阵,并使用它来变换相机。

然后,我们将通过对变换矩阵求逆来创建基矩阵的变化,并将其应用于一个点,并将其坐标从世界帧更改为相机帧。

下面是示例的笔记本,也可以在存储库中找到。

https://github.com/wingedrasengan927/Image-formation-and-camera-calibration

%matplotlib widget

import matplotlib.pyplot as plt
from utils import *

创建转换矩阵

# rotate an angle of pi/4 along the standard Y axis
angles = [np.pi/4]
order = 'y'

# transalte by the given offset
offset = np.array([0, -8, 0])

# define parameters for the image plane
f = 2
img_size = (7, 7)
# create rotation transformation matrix
R = create_rotation_transformation_matrix(angles, order)
R_ = np.identity(4)
R_[:3, :3] = R

# create translation transformation matrix
T_ = create_translation_matrix(offset)
R_, T_
(array([[ 0.70710678,  0.        , -0.70710678,  0.        ],
        [ 0.        ,  1.        ,  0.        ,  0.        ],
        [ 0.70710678,  0.        ,  0.70710678,  0.        ],
        [ 0.        ,  0.        ,  0.        ,  1.        ]]),
 array([[ 1.,  0.,  0.,  0.],
        [ 0.,  1.,  0., -8.],
        [ 0.,  0.,  1.,  0.],
        [ 0.,  0.,  0.,  1.]]))

转换并绘制

# create an image grid
xx, yy, Z = create_image_grid(f, img_size)

# convert the image grid to homogeneous coordinates
pt_h = convert_grid_to_homogeneous(xx, yy, Z, img_size)

# transform the homogeneous coordinates
pt_h_transformed = R_ @ T_ @ pt_h

# convert the transformed homogeneous coordinates back to the image grid
xxt, yyt, Zt = convert_homogeneous_to_grid(pt_h_transformed, img_size)
# define axis and figure
fig = plt.figure(figsize=(6, 4))
ax = fig.add_subplot(111,projection='3d')

# set limits
ax.set(xlim=(-10, 5), ylim=(-15, 5), zlim=(0, 10))

# plot the global basis and the transformed camera basis
ax = pr.plot_basis(ax)
ax = pr.plot_basis(ax, R, offset)

# plot the original and transformed image plane
ax.plot_surface(xx, yy, Z, alpha=0.75)
ax.plot_surface(xxt, yyt, Zt, alpha=0.75)

ax.set_title("camera transformation")
ax.set_xlabel("X-axis")
ax.set_ylabel("Y-axis")
ax.set_zlabel("Z-axis")
Text(0.5, 0, 'Z-axis')

相机校准—外参矩阵

创建基的变换矩阵

E = np.linalg.inv(R_ @ T_)
# remove last row of E
E = E[:-1, :]

进行坐标变换

cw = np.array([-1/np.sqrt(2), -8, 1/np.sqrt(2), 1]) # homogeneous coordinates of the point wrt the world
cc = E @ cw.reshape(4, 1) # coordinates of the point wrt the camera
cc = cc.flatten()
cc
array([0., 0., 1.])

让我们一步一步地分解:

  • 首先,我们导入必要的库。utils.py文件包含所有必要的帮助函数。%matplotlib widget启用了ipympl后端,使我们能够使用绘图。

  • 接下来,我们定义必要的参数,如角度、旋转顺序、平移偏移、焦距和图像平面的大小。焦距和图像平面仅用于演示目的,我们将在下一篇文章中详细讨论它们。

  • 在这里,我们保持简单,关于标准Y轴旋转𝜋/4。然而,我们可以围绕任何轴进行任意数量的旋转。注意旋转的顺序。我们的平移偏移量是[0,-8,0],沿Y轴8个单位。

  • 使用这些参数,我们为旋转和平移创建变换矩阵。

  • 接下来,我们使用变换矩阵转换最初位于原点的相机并绘制它。多亏了ipympl,图表是互动的。试着摆弄一下图表,用不同的视角来观看。

相机校准—外参矩阵

  • 接下来,我们通过对变换矩阵求逆来创建基矩阵的变化,即相机外参矩阵。

  • 最后,我们取一个世界坐标[-1/√2, -8, 1/√2],然后应用基变换的变化,得到相机的坐标为[0, 0, 1]。这是有意义的,因为该点位于相机Z轴的正上方。

感谢阅读!

参考引用

计算机视觉导论——Udacity:https://classroom.udacity.com/courses/ud810

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓文章来源地址https://www.toymoban.com/news/detail-415411.html

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓

到了这里,关于相机校准—外参矩阵的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 相机标定 >> 坐标系转换@内参、外参

    为了更好的理解标定,首先应熟悉各个坐标系。(坐标系图均取自百度百科) 该坐标系是以图像左上角为原点建立以像素为单位的二维坐标系u-v。(相对坐标系) 图像坐标系是以 O1 (是图像的主点,也即光轴与像平面的交点,一般就是像素坐标系的中点)为原点的二维坐标

    2024年02月12日
    浏览(37)
  • 相机和雷达外参联合标定

    内容: 关于雷达和相机外参联合标定的踩坑纪录。 Date: 2023/03/19 硬件: 上位机: Jetson ORIN (Ubuntu 20.04, ROS noetic) 雷达: Ouster 32线 相机: Intel D435 一、 标定方案 目前流行的 雷达+相机 标定方案有五种:Autoware, apollo, lidar_camera_calibration, but_velodyne。 Ubuntu20.04安装autoware我看bug比较多,因

    2024年02月11日
    浏览(39)
  • 关于相机内参与外参的浅读

    原文地址:https://tunmx.github.io/posts/CH-Camera-internal-and-external-parameters/ 学习人脸3D重建的第一天,在首次接触3D相关的内容,必须要搞清楚相机的成像原理,如何将真实三维空间中的三维点与显示器、屏幕和图像等二维成像的平面映射,以及了解该过程的推导方式和相关坐标系的

    2024年02月15日
    浏览(27)
  • 计算机视觉(相机标定;内参;外参;畸变系数)

    目录 一、预备知识 1、坐标系变换过程(相机成像过程) (1)相机坐标系转换为图像坐标系(透视投影变换遵循的是针孔成像原理) (2)齐次坐标的引入原因:(为什么引入齐次坐标???) 2、内参与外参矩阵的构成 3、畸变参数 二、相机标定 1、张正友标定法(光学标

    2024年02月07日
    浏览(36)
  • (九)相机内参、外参、反透视变换python opencv

    任务需求:将相机上的一个点投影到真实世界平面上去。 原则上单目相机是不可以的,因为只记录了二维信息,真实世界是三维的,双目相机可以通过视差,或者单目+IMU组合,但是 由于特征点在地面上的先验知识 ,因此可以进行反透视变换。方法有很多种那个,这里采用计

    2024年02月06日
    浏览(34)
  • 使用 OpenCV 进行相机校准

    相机已经存在了很长时间。然而,随着 20 世纪后期廉价针 孔 相机的推出,它们在我们的日常生活中变得司空见惯。不幸的是,这种廉价是有代价的:严重的失真。幸运的是,这些是常数,通过校准和一些重新映射,我们可以纠正这一点。此外,通过校准,您还可以确定相机

    2024年04月12日
    浏览(41)
  • OpenCV+相机校准和3D重建

    相机校准至少需要10个测试图案,所需的重要输入数据是3D现实世界点集以及图像中这些点的相应2D坐标。3D点称为对象点,而2D图像点称为图像点。 除了棋盘,我们还可以使用圆形网格。 在这种情况下,我们必须使用函数cv.findCirclesGrid()来找到模式。 较少的图像足以使用圆形

    2024年02月05日
    浏览(40)
  • Opencv实验合集——实验八:相机校准

    首先,我们来理解一下怎么从相机的角度去看一张图片,就好比如你用眼睛作为相机来进行摄影,但是比摄影机强的是,你是怎么摄影图片之后再将它矫正出现在你眼前,将歪歪扭扭的图片变成一张在你眼前是一张直的图片 为了轻松理解问题,假设您在房间中部署了一个摄像

    2024年02月02日
    浏览(28)
  • OpenCV每日函数 相机校准calibrateCamera函数

    1、概述         估计相机参数的过程称为相机校准。         这意味着我们拥有相机所需的所有信息(参数或系数),以确定现实世界中的3D 点与其在该校准相机捕获的图像中对应的 2D 投影(像素)之间的准确关系。         通常这意味着恢复两种参数      

    2024年02月10日
    浏览(45)
  • Gocator 3D线扫相机校准流程说明

    首先清除之前的校准数据 设定校准使用的有效数据区域,然后进行校准 有效区域的选择是以(长度+起始点)的方式选择的,即先设定轴的有效长度,然后选择数据的起始点 重新选取有效区域作为图像输出的范围 3D相机会自动根据校准后得到的高计算此时的测量宽度,即上图

    2024年02月11日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包