Auther:SeaHIRobot
date: 2023-05-03
最近在做一门课程的项目,在pybullet中复现GGCNN的机械臂视觉抓取的深度学习网络。在搭建仿真环境时,又回到了绕不开的相机内参和外参。借此机会对相机内参外参这一套进行一个review,对这个问题进行一个逻辑梳理。
因此本文不建议纯小白阅读,很多基础概念不会细讲,适合对相机内参外参有一定了解但不完全熟练的同学。
下面的链接是来自pybullet官方Doc中对相机内参的推荐阅读,讲的非常生动。
Dissecting the Camera Matrix, Part 3: The Intrinsic Matrix ←
这里的知乎文章也推荐阅读,内容详细:
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
fx

本文介绍了在PyBullet环境中用GGCNN实现机械臂视觉抓取时,如何理解和处理相机内参与外参。文章强调了从2D像素点到3D世界坐标转换的重要性,并通过针孔相机模型解释了内参矩阵的作用,包括焦距、轴偏移和skew参数。此外,还提到了外参矩阵作为相机到世界坐标系转换的关键。在真实摄像头应用中,需要通过标定得到这些参数。
最低0.47元/天 解锁文章
5397





