一文理清相机内参和外参矩阵的来龙去脉 -- review向

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


Auther:SeaHIRobot
date: 2023-05-03


最近在做一门课程的项目,在pybullet中复现GGCNN的机械臂视觉抓取的深度学习网络。在搭建仿真环境时,又回到了绕不开的相机内参和外参。借此机会对相机内参外参这一套进行一个review,对这个问题进行一个逻辑梳理。

因此本文不建议纯小白阅读,很多基础概念不会细讲,适合对相机内参外参有一定了解但不完全熟练的同学。

下面的链接是来自pybullet官方Doc中对相机内参的推荐阅读,讲的非常生动。

Dissecting the Camera Matrix, Part 3: The Intrinsic Matrix ←

这里的知乎文章也推荐阅读,内容详细:

zhuanlan.zhihu.com

Problem Defination - 问题定义

我们为什么要研究内参外参呢?这些东西有什么意义呢?

思考一下你目前想干的事情,你有一个相机,你想通过相机来提取场景信息,而通过相机你能获得到的仅仅是由rgb像素构成的2d画面。从3d的世界中,映射出一个2d的画面,这是相机的功能。你想做的,是通过相机输出的2d画面获取3d信息,那么这中间就存在着2d的像素空间和3d的真实空间的一个变换

我们要做的恰恰是寻找这种变换的一种数学表达,借助相机2d的由像素构成的画面,完成我们提取场景信息的任务。

”图片里2d的像素点位 → \rightarrow 3d的世界坐标系中的点位“

这个任务既有3d的坐标变换,又有像素的2d点位向实际的空间坐标之间的尺度变换,怎么进一步拆分好让我们理解呢?那就是一步一步来咯。

”2d像素点位 → \rightarrow 3d相机坐标系点位 → \rightarrow 3d世界坐标系点位“

到这里不熟悉相机坐标系和齐次变换的同学请自行上网百科学习。

Pinhole Camera - 针孔相机

为什么讲针孔相机?这个模型有什么用?

因为他是一个很好理解这个问题的简单的模型,你可以简单得认为所有相机都是这么成像的;

内参矩阵,数码相机,计算机视觉,人工智能,深度学习

(图源http://ksimek.github.io/2013/08/13/intrinsic)

图中的box就是相机,小孔就是镜头。光路从环境中射入,通过小孔,最终在film上呈现倒像。倒像看起来比较烦,不如我们把按照相似三角形(或着说沿着Pinhole对称一下)到树的一边,就成了正像,如下图。(不用纠结这样做有什么意义,问就是方便看/doge,下面聊内参的时候你将会看到有了操作有多奇妙)

内参矩阵,数码相机,计算机视觉,人工智能,深度学习

(图源https://zhuanlan.zhihu.com/p/389653208)

使用简单的相似三角形,貌似就可以解决针孔相机的问题。但如果事情再复杂一点呢?

比如:

  • 被拍摄平面(图里的树)和film不是平行的
  • film中心并不在Pinhole轴线上,有垂直轴线平面的偏移
  • 实际的镜头有畸变,不符合针孔摄像头的简单的相似三角形变换
  • blablabla…

下面就有请内参矩阵(intrinsic matrix)登场,进一步刻画这个问题。

Intrinsic Matrix - 内参矩阵

首先,内参矩阵长这个熊样子:
I n t r i n s i c   M a t r i x = ( f x s x 0 0 f y y 0 0 0 1 ) Intrinsic \ Matrix=\left(\begin{array}{c} f_x & s & x_0 \\ 0 & f_y & y_0 \\ 0 & 0 & 1 \end{array}\right) Intrinsic Matrix= fx00sfy0x0y01

先不纠结里面的参数,他干了一件什么事呢?见公式
( u v 1 ) = 1 z c ( f x s x 0 0 f y y 0 0 0 1 ) ( x c y c z c ) \left(\begin{array}{c} u \\ v \\ 1 \end{array}\right) = \frac{1}{z_c}\left(\begin{array}{c} f_x & s & x_0 \\ 0 & f_y & y_0 \\ 0 & 0 & 1 \end{array}\right) \left(\begin{array}{c} x_c \\ y_c \\ z_c \end{array}\right) uv1 =zc1 fx00sfy0x0y01 xcyczc

它连接了像素平面的2d点相机系;

u和v指定了像素平面内的点位,脚标c代表了相机坐标系。 z c z_c zc是相机坐标系的z方向坐标,换一个说法,就是“深度”。前面的 1 z c \frac{1}{z_c} zc1也就是做z方向归一化,也可以把它写进后面的 ( x c , y c , z c ) T (x_c,y_c,z_c)^T (xc,yc,zc)T里,那么相机坐标系里的坐标就变成了在z方向归一化之后的坐标了。下面的图很好的阐释了这个过程,同时也解释了把真实像对称过来的妙处(因为看起来真的舒服)。

内参矩阵,数码相机,计算机视觉,人工智能,深度学习

(自己画的,凑合看吧)

把上面的式子求个逆,就从像素坐标得到了在相机系中的坐标:
( x c y c z c ) = z c ( f x s x 0 0 f y y 0 0 0 1 ) − 1 ( u v 1 ) \left(\begin{array}{c}x_c \\ y_c \\ z_c \end{array}\right) = {z_c}\left(\begin{array}{c} f_x & s & x_0 \\ 0 & f_y & y_0 \\ 0 & 0 & 1 \end{array}\right)^{-1} \left(\begin{array}{c} u \\ v \\ 1 \end{array}\right) xcyczc =zc fx00sfy0x0y01 1 uv1

那 Intrinsic Matrix 里面的参数是干嘛的呢???为什么x和y方向都有一个焦距???s究竟是什么??? x 0 x_0 x0 y 0 y_0 y0到底用什么convention???

这里我简短回答一下:

  • 有两个焦距的原因是实际传感器和理想模型的偏差,工艺、像素的几何形状等原因
  • s s s描述了axis skew,传感器绕主轴的旋转程度,理想情况如仿真环境中,那 s s s就是0了(总不可能在相机组装的时候怼的准准的吧,不是吧不是吧)
  • x o x_o xo y 0 y_0 y0描述了主轴偏移。因为z轴都归一化了,归一化的便利是可以用scaling的方式描述像素尺寸,那 x 0 x_0 x0 y 0 y_0 y0的单位顺理成章的也是像素了。因为我们描述图片的像素坐标时候,一般都是左上角为原点,x轴向右,y轴向下,在理想情况如仿真环境中,那 x 0 x_0 x0就是1/2的传感器宽度(像素值), y 0 y_0 y0就是1/2的传感器高度(像素值);当图片是640x480的时候, x 0 x_0 x0就是320, y 0 y_0 y0就是240。

详细的话还是参考http://ksimek.github.io/2013/08/13/intrinsic文章里的解释,作者还配上了交互式窗口,可以直观的感受内参矩阵的参数带来的影响(真的不是我懒,不是…)

Extrinsic Matrix - 外参矩阵

上面我们借助内参矩阵完成了像素点 ( u , v ) (u,v) (u,v)到对应的相机坐标系下的点 ( x c , y c , z c ) (x_c,y_c,z_c) (xc,yc,zc),那么想要最重要获得 ( u , v ) (u,v) (u,v)对应的世界坐标系中的点,那还不好办,只需要知道变换矩阵 Transfer Matrix 就可以了。所以外参矩阵就是单纯的相机系到约定的世界坐标系的 4by4 的 齐次变换矩阵

齐次变换掌握不牢固的自行补一补。

到这里,我们最后用公式梳理一下怎么从二维像素点位鼓捣到三维世界坐标点位的:
第一步: ( x c y c z c ) = z c ( f x s x 0 0 f y y 0 0 0 1 ) − 1 ( u v 1 ) 第二步: ( x w y w z w ) = H c w ( x c y c z c ) M i s s i o n   c o m p l e t e d . 第一步:\left(\begin{array}{c}x_c \\ y_c \\ z_c \end{array}\right) = {z_c}\left(\begin{array}{c} f_x & s & x_0 \\ 0 & f_y & y_0 \\ 0 & 0 & 1 \end{array}\right)^{-1} \left(\begin{array}{c} u \\ v \\ 1 \end{array}\right) \\ \\ 第二步:\left(\begin{array}{c} x_w \\ y_w \\ z_w \end{array}\right) = H_{c}^{w}\left(\begin{array}{c} x_c \\ y_c \\ z_c \end{array}\right) \\ \\ Mission \ completed. 第一步: xcyczc =zc fx00sfy0x0y01 1 uv1 第二步: xwywzw =Hcw xcyczc Mission completed.

相机标定

在仿真环境中,是不用标定的,按照理想情况构造就行了。

使用真实摄像头就涉及到标定的环节,通过标定我们其实就是为了拟合出像模像样的Intrinsic Matrix和Extrinsic Matrix,好让我们完成这个从二维像素平面提取世界中的三维信息的任务。

完结

觉得有用点个赞文章来源地址https://www.toymoban.com/news/detail-762634.html

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

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

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

相关文章

  • 计算机视觉(相机标定;内参;外参;畸变系数)

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

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

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

    2024年02月06日
    浏览(48)
  • 相机校准—外参矩阵

    在本文中,我们将探讨摄影机的外参,并通过Python中的一个实践示例来加强我们的理解。 相机外参 摄像头可以位于世界任何地方,并且可以指向任何方向。我们想从摄像机的角度来观察世界上的物体,这种从世界坐标系到摄像机坐标系的转换被称为摄像机外参。 那么,我们

    2023年04月16日
    浏览(64)
  • 相机内参矩阵K和fov的相互转换

    fov  f  height之间关系          从图可以很直观的看出fov_y 焦距f和图像高之间的关系,tan(fov_y/2) = 2/h / fy.所以正反向的转换过程就很直接。f以pixel为单位。

    2024年02月11日
    浏览(59)
  • 标定(内参、外参)

    在计算机视觉中,特别是在相机标定和立体视觉领域,内参(intrinsic parameters)和外参(extrinsic parameters)是非常重要的概念。它们与相机的几何属性和姿态有关。 内参(Intrinsic Parameters) : 内参是描述相机内部属性的参数,包括焦距、主点(光学中心)坐标、畸变系数等。

    2024年02月14日
    浏览(44)
  • OpenCV开发笔记(七十七):相机标定(二):通过棋盘标定计算相机内参矩阵矫正畸变摄像头图像

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/136616551 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、

    2024年03月13日
    浏览(48)
  • 一文解释mapState的来龙去脉

    mapState Vuex 提供的辅助函数之一,将 store 中的状态映射到组件的计算属性中,使得在组件中可以轻松地访问 Vuex store 中的状态值 MapState(映射状态) 在我们的 Count.vue 组件中,可以使用 mapState 来更简洁地获取 count 的状态值 首先,导入 mapState : 然后,在 computed 中使用 mapState :

    2024年02月07日
    浏览(41)
  • 【相机标定】相机内参

    相机在计算机视觉方面的一些应用一般需要相机标定。我们总是听到标定这个词,那么具体标定的是什么呢?相机的拍摄是一个三维到二维(透视投影)的过程,这个过程可以用数学模型去表述,标定便是计算这个数学模型中的参数,我们最终希望通过这些参数能够从二维的

    2023年04月10日
    浏览(48)
  • matlab相机标定求得相机内参

    可以去官网下载标定板,然后使用我们的相机进行拍照(10~15张即可): 下载请点击这里:here 在拍摄照片之前,先量取对应的每个方格的长度: 如下: 打开MATLAB的命令行: 输入 cameraCalibrator #调用标定的工具箱 添加的是刚刚我们拍照标定板的图片。 点击运行按钮 参数导出

    2024年02月09日
    浏览(47)
  • 相机内参标定理论篇------相机模型选择

    当拿到一款需要标定内参的相机时,第一个问题就是选择那种的相机模型来标定相机。首先对相机类型进行分类,然后针对相机类型选择相机模型。工程上相机类型的划分并不是十分严格,一般来说根据相机FOV可以把相机大概分为以下几类: 长焦相机:=  标准相机:~; 广角

    2024年02月04日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包