笔记:立体视觉涉及的相机模型、参数、3D坐标系、内外参计算等

这篇具有很好参考价值的文章主要介绍了笔记:立体视觉涉及的相机模型、参数、3D坐标系、内外参计算等。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

3D视觉、SLAM、自动驾驶算法经常会碰到多传感器标定、数据对齐的问题,比如下面这个图(CADCD):

笔记:立体视觉涉及的相机模型、参数、3D坐标系、内外参计算等,AI,数码相机,3d,计算机视觉,人工智能

图1

上面就包含了7个camera,每个camera的位姿不同,采集到的数据也不同,怎么通过这些数据重建3D场景就需要用到对齐。

下图是human3.6的采集环境配置图:
笔记:立体视觉涉及的相机模型、参数、3D坐标系、内外参计算等,AI,数码相机,3d,计算机视觉,人工智能

关于这一块的知识点有点多,容易忘,不记录下下次又得从头再来。

相机成像

首先理理相机模型,以及几个知识点,参考自CS231A camera model。

pinhole camera model

小孔模型,光通过小孔在像平面上形成一个倒立的图像,如下图所示:
笔记:立体视觉涉及的相机模型、参数、3D坐标系、内外参计算等,AI,数码相机,3d,计算机视觉,人工智能
笔记:立体视觉涉及的相机模型、参数、3D坐标系、内外参计算等,AI,数码相机,3d,计算机视觉,人工智能
小孔模型很简单:

  1. 光圈
    光圈即小孔。放大光圈能增加进光量,但同一个点通过的光线也会增加形成模糊的区域。因此,增加光圈的大小会影响到进光量、图像的清晰度、景深;光圈小,亮度暗,清晰;光圈大,亮度大,模糊;
  2. 像距
    像距即光圈到像平面(感光元件或者胶卷)的距离。当像平面大小固定时且足够大时,改变像距会导致投影变大或变小;否则,调整像距会改变FOV;

lens model

笔记:立体视觉涉及的相机模型、参数、3D坐标系、内外参计算等,AI,数码相机,3d,计算机视觉,人工智能
透镜模型能解决小孔模型为了成像清晰而光照不足的问题,但会引入另外一个问题,弥散。

上图object中有两个点,红点经过透镜后可以完美的映射到焦平面,而蓝点则形成了一个圆形的扩散区域,即弥散,这个区域的半径就是弥散半径。
弥散会造成模糊,因此,一般会把半径设置在一定的范围内。

焦距

在相机模型里面,焦距就是透镜聚焦平行光的能力,如下图所示:
笔记:立体视觉涉及的相机模型、参数、3D坐标系、内外参计算等,AI,数码相机,3d,计算机视觉,人工智能
定焦镜头不能修改焦距,而变焦镜头可以,这个就是变焦(相机的“对焦”和“变焦”,这二者有什么区别?):
笔记:立体视觉涉及的相机模型、参数、3D坐标系、内外参计算等,AI,数码相机,3d,计算机视觉,人工智能

像距

像平面是成像元件所在的平面,成像元件包括图像传感器、胶卷等:
笔记:立体视觉涉及的相机模型、参数、3D坐标系、内外参计算等,AI,数码相机,3d,计算机视觉,人工智能
上图像z‘表示像距,f表示焦距。可见:
z ′ = f + z 0 z'=f+z_0 z=f+z0
不同远近的目标通常不一定能精准的聚焦在焦平面上,因此,调整像距使之匹配就可以让成像清晰,这个过程就叫做变焦。

景深

透镜模型能聚集入射光形成一个焦点,这个焦点所在的平面为焦平面,但是不同远近的目标或者目标点会在焦平面前、后形成焦点,这个时候同样会在焦平面会形成一个弥散圆。如下图所示(from 景深的原理是什么? - 潘安的回答):

笔记:立体视觉涉及的相机模型、参数、3D坐标系、内外参计算等,AI,数码相机,3d,计算机视觉,人工智能

上图近点(绿线)的焦点在焦平面后,这个点到焦平面的距离叫做后焦深,远点(红线)的焦点在焦平面前形成,这个点到焦平面的距离叫做前焦深。
从公式可以看出,影响景深的参数有四个:

  • 弥散圆。和相机硬件配置有关,一般是固定的。
  • 像距。负相关
  • 物距。正相关
  • 光圈。负相关

FOV

FOV的公式也很简单,定焦镜头下,H为像平面的高,W为宽,f为焦距:
f o v H = a r c t a n ( H f ) fovH = arctan(\frac{H}{f}) fovH=arctan(fH)
f o v W = a r c t a n ( W f ) fovW = arctan(\frac{W}{f}) fovW=arctan(fW)
从公式可以看出

  • H和W,正i相关
  • f,负相关
    笔记:立体视觉涉及的相机模型、参数、3D坐标系、内外参计算等,AI,数码相机,3d,计算机视觉,人工智能

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

下图是常见的四个坐标系(from pytorch3D ):
笔记:立体视觉涉及的相机模型、参数、3D坐标系、内外参计算等,AI,数码相机,3d,计算机视觉,人工智能

world->camera

本质是把世界坐标系的原点经过旋转和平移变换到相机坐标系原点(镜头中心),这两个坐标系都是以米作为单位。
P c = R P t + T P_{c} = RP_{t} + T Pc=RPt+T

R和T为相机外参,通过相机标定得到。

世界坐标系的原点可以任意指定,比如车头某个点、或者车身中心。

如果两者重合,那旋转矩阵为 I I I,平移参数为[0, 0, 0]。

举个例子,图1中的两个可见光相机cam_01和 cam_07,如果, R 01 R_{01} R01 T 01 T_{01} T01 分别表示cam_01的外参矩阵,则:

P 01 = R 01 ∗ P w + T 01 P_{01} = R_{01}*P_{w} + T_{01} P01=R01Pw+T01
如果知道这两个相机的变换矩阵 R 01 − > 02 R_{01->02} R01>02 T 01 − > 02 T_{01->02} T01>02(一般相机之间的安装相对固定):
P 02 = R 01 − > 02 ∗ P 01 + T 01 − > 02 P_{02} = R_{01->02}*P_{01} + T_{01->02} P02=R01>02P01+T01>02

camera->NDC

光经过透镜的折射聚集后投影在图像传感器上,这个传感器所在的平面就是NDC。传感器大多以英寸作为单位:
笔记:立体视觉涉及的相机模型、参数、3D坐标系、内外参计算等,AI,数码相机,3d,计算机视觉,人工智能
变换矩阵可以通过三角形定理可以可到:
[ x n d c y n d c 0 ] = [ f x / z x 0 0 0 f y / z y 0 0 0 0 ] ∗ [ x c a m y c a m 0 ] \begin{bmatrix} x_{ndc} \\ y_{ndc} \\ 0 \end{bmatrix} = \begin{bmatrix} f_{x}/z_{x} & 0 & 0 \\ 0 & f_{y}/z_{y} & 0 \\ 0 & 0 & 0 \end{bmatrix} * \begin{bmatrix} x_{cam} \\ y_{cam} \\ 0 \end{bmatrix} xndcyndc0 = fx/zx000fy/zy0000 xcamycam0

camera - > screen

很好理解,唯一要注意的就是关于像素和长度的换算问题,不同的分辨率对应不同的缩放系数:
k x = i m g _ w i d t h / W k_x = img\_width / W kx=img_width/W
k y = i m g _ h e i g h t / H k_y = img\_height / H ky=img_height/H
screen坐标系的原点在中心,因此还要计算偏移量 u u u v v v,最后公式如下:
[ x s c r e e n y s c r e e n 0 ] = [ k x f x / z x 0 u 0 k y f y / z y v 0 0 0 ] ∗ [ x c a m y c a m 0 ] \begin{bmatrix} x_{screen} \\ y_{screen} \\ 0 \end{bmatrix} = \begin{bmatrix} k_{x}f_{x}/z_{x} & 0 & u \\ 0 & k_{y}f_{y}/z_{y} & v \\ 0 & 0 & 0 \end{bmatrix} * \begin{bmatrix} x_{cam} \\ y_{cam} \\ 0 \end{bmatrix} xscreenyscreen0 = kxfx/zx000kyfy/zy0uv0 xcamycam0

示例

下面是videopose3d关于human3.6M的部分代码,具体见原代码:

pos_3d = world_to_camera(anim['positions'], R=cam['orientation'], t=cam['translation'])
pos_2d = wrap(project_to_2d, pos_3d, cam['intrinsic'], unsqueeze=True)
pos_2d_pixel_space = image_coordinates(pos_2d, w=cam['res_w'], h=cam['res_h'])
positions_2d.append(pos_2d_pixel_space.astype('float32'))

最后,可能还会涉及四元数、欧拉角等,知识点有点多,以后再慢慢补充。文章来源地址https://www.toymoban.com/news/detail-856791.html

到了这里,关于笔记:立体视觉涉及的相机模型、参数、3D坐标系、内外参计算等的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【视觉SLAM十四讲学习笔记】第五讲——相机模型

    专栏系列文章如下: 【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍 【视觉SLAM十四讲学习笔记】第二讲——初识SLAM 【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵 【视觉SLAM十四讲学习笔记】第三讲——旋转向量和欧拉角 【视觉SLAM十四讲学习笔记】第三讲——四元数 【视

    2024年01月17日
    浏览(42)
  • 深入浅出理解CSS中的3D变换:踏上立体视觉之旅

    在现代Web设计中,CSS 3D变换已经成为增强用户体验、打造沉浸式界面的重要手段。借助CSS的3D变换属性,我们可以轻松实现元素在三维空间中的旋转、移动、缩放等操作,从而创造出生动活泼、富有立体感的网页效果。本文将从基础知识出发,通过易于理解的概念解析和实战

    2024年04月22日
    浏览(47)
  • 【opencv】示例-stereo_calib.cpp 基于OpenCV的立体视觉相机校准的完整示例

    这段代码是一个用于执行立体视觉系统校准的应用程序的主函数main。它按以下步骤执行: 初始化用于指定棋盘尺寸、图像列表文件名、是否展示校正结果等参数的变量。 解析命令行输入的参数,其中包括棋盘的宽度、高度、类型、格子大小、Aruco标记大小、Aruco字典名称、额

    2024年04月15日
    浏览(46)
  • Python pyglet 自制3D引擎入门(二) -- 绘制立体心形,动画和相机控制

    Python作为目前较广泛的编程语言, 用于制作3D游戏可谓得心应手。本文讲解使用Python pyglet库自制简易3D引擎的方法技巧。 上篇:Python pyglet 自制3D引擎入门(一) – 绘制几何体、创建3D场景 先放效果图: pyglet.window 部分用于实现窗口操作, pyglet.gl 以及 pyglet.gl.glu 模块包含了OpenGL的

    2024年02月10日
    浏览(41)
  • 3D视觉之深度相机方案

    随着机器视觉,自动驾驶等颠覆性的技术逐步发展,采用 3D 相机进行物体识别,行为识别,场景 建模的相关应用越来越多,可以说 3D 相机就是终端和机器人的眼睛。 3D 相机又称之为深度相机,顾名思义,就是通过该相机能检测出拍摄空间的景深距离,这也是与普 通摄像头

    2023年04月21日
    浏览(44)
  • 机器视觉初步13:3D相机介绍

    在工业中,3D相机是一种非常重要的传感器,它通过测量目标的物理尺寸和形状来获取关于目标的数据。这种3D相机的工作原理主要基于机器视觉和计算机视觉技术。以下是一些常见的3D相机的工作原理: 这种3D相机使用特定类型的激光光源和摄像机,通常是红外光。激光在物

    2024年02月14日
    浏览(36)
  • 机器视觉海康工业相机SDK参数设置获取

    视觉人机器视觉培训-缺陷检测项目-食品行业草鸡蛋外观检测 相机参数类型可分为六类,除 command 参数外,每一类都有其对应的设置与获取函数接口。 表 1 参数类型及对应函数接口介绍 *详细函数接口可参考 SDK 手册: ​C:Program Files (x86)MVSDevelopmentDocumentations 相机参数类型

    2024年02月07日
    浏览(94)
  • 机器视觉【3】非线性求解相机几何参数

    上一章节介绍学习了(DLT)线性求解相机几何参数,了解到线性求解法当中比较明显的缺点: 没有考虑到镜头畸变的影响 不能引入更多的约束条件融入到DLT算法当中优化 最关键的是,代数距离并不是计算相机矩阵的最佳距离函数 基于以上问题点,提出非线性求解方法。 将

    2024年02月21日
    浏览(55)
  • (02)Cartographer源码无死角解析-(19) SensorBridge→雷达点云数据帧处理与坐标系变换(涉及函数重载)

    本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/127350885   文 末 正 下 方 中 心 提 供 了 本 人 联 系 方 式

    2024年02月01日
    浏览(68)
  • 视觉相机模型以及投影原理推导——(单目)

    参考文献:视觉SLAM十四讲、视觉惯性SLAM理论与源码分析、该博客、文中的公式直接引用上面的文章,如有侵权请联系本人删除 投影过程 三维世界中的物体(目标点)P反射光线,通过相机光心,投影到相机的感光平面(物理成像平面/像素成像平面),一个个的光线投影点汇

    2024年02月09日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包