IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 【python】Camera Calibration -> 正文阅读

[人工智能]【python】Camera Calibration

在这里插入图片描述

汇总整理摘抄自



1 坐标系简介

在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数(内参、外参、畸变参数)的过程就称之为相机标定(或摄像机标定)。无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在。

确定空间物体表面某点的三维几何位置与其在拍摄图像中对应点之间的相互关系涉及到了如下四个坐标系

  • 像素平面坐标系 ( u , v ) (u,v) (u,v)

  • 像平面坐标系(图像物理坐标系) ( x , y ) (x,y) (x,y)

  • 相机坐标系 ( X c , Y c , Z c ) (X_c,Y_c,Z_c) (Xc?,Yc?,Zc?),camera coordinate system

  • 世界坐标系 ( X w , Y w , Z w ) (X_w,Y_w,Z_w) (Xw?,Yw?,Zw?),world coordinate system (wcs)

在这里插入图片描述
我们通过假设一些参数,使上面四个坐标系之间的坐标联系起来,这样我们就可以把拍摄的图片上的一个点坐标反推导出世界坐标系中的那个点坐标,这样就达到了三维重建的目的。

在这里插入图片描述

在这里插入图片描述

世界坐标系通过平移和旋转(刚体变换)得到相机坐标系相机坐标系通过成像模型中的相似三角形原理(透视投影)得到图像坐标系图像坐标系通过平移和缩放得到像素坐标系

2 图像物理坐标系与像素坐标系

图像物理坐标系 ( x , y ) (x,y ) (x,y):以相机光轴与成像平面的交点(principal point)为坐标原点,描述物体通过投影投射在成像平面中的位置(感光芯片上像素的实际大小),单位一般为 mm,属于物理单位。

在这里插入图片描述

红色圈出来的区域,即是图像物理坐标系, 红色的原点,可以记为图像坐标系的原点。

像素坐标系 ( u , v ) (u,v ) (u,v):以成像平面左上顶点为坐标原点,为了描述像素点(pixel)在数字图像中的坐标位置而引入。

在这里插入图片描述
图像坐标系与像素坐标系之间的转换关系如下:

在这里插入图片描述

写成矩阵形式:
在这里插入图片描述

再写成齐次坐标形式:

在这里插入图片描述
其中, ( u , v ) (u,v ) (u,v) 表示像素的行数和列数, ( u 0 , v 0 ) (u_0,v_0 ) (u0?,v0?) 表示图像坐标系原点在像素坐标系中的坐标, d x dx dx d y dy dy 表示单个像素分别在 x x x 轴和 y y y 轴上的物理尺寸(单位为 mm/pixel),因而 x d x \frac{x}{dx} dxx? y d y \frac{y}{dy} dyy?的单位为像素。

当然我们也可以表示成如下形式

在这里插入图片描述

3 像素坐标系与相机坐标系(内参)

相机坐标系 ( X c , Y c , Z C ) (X_c,Y_c,Z_C ) (Xc?,Yc?,ZC?):以相机的光心为坐标原点, [公式] 轴与相机光轴平行,单位为 mm

Z c Zc Zc 是指的图像深度信息,每个像素点的 Z c Zc Zc 都会有差别

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

是不是老觉得上面这几幅图和小孔成像背离了,卡看下面这两幅图就柳暗花明,豁然开朗了

在这里插入图片描述
在这里插入图片描述
红框部分也即

在这里插入图片描述

或者直接画成这样就会直观很多

在这里插入图片描述
在这里插入图片描述


根据三角形相似原理可得:
在这里插入图片描述
整理可得:
在这里插入图片描述
写成齐次坐标矩阵形式:

在这里插入图片描述
将像素坐标系与图像坐标系的转换公式带入,可得:

在这里插入图片描述

整理可得:
在这里插入图片描述
其中, f x = f d x fx = \frac{f}{dx} fx=dxf? f y = f d y fy = \frac{f}{dy} fy=dyf? 分别表示相机在 x x x 轴和 y y y 轴方向上的焦距,相机内参(Camera Intrinsic parameter) K K K 为:

在这里插入图片描述

4 相机坐标系与世界坐标系(外参)

世界坐标系 ( X W , Y W , Z W ) (X_W,Y_W,Z_W ) (XW?,YW?,ZW?)

由于摄像机和物体可以安放在环境中的任何位置,因此需要在环境中选择一个基准坐标系来描述摄像机的位置,并用它来描述环境中任何物体的位置,这个坐标系就叫做世界坐标系

想将不同视点/视角拍摄的图像信息整合在一起就必须将所有的信息放在同一个坐标系下,这个坐标系应与各张图像的 相机/物体/像素 这些相对坐标系无关,在确定后应不变且唯一,即应为绝对坐标系,我们将这个坐标系称为 世界坐标系

世界坐标系可以任意选择,为假想坐标系,在被指定后随即 不变且唯一,即为绝对坐标系

相机坐标的原点,可以是任意的相机位置(如下图黄色框内),一般把相机的光心设置为相机坐标的原点,空间中 Z 轴与摄像机的光轴平行!

在这里插入图片描述

世界坐标系与相机坐标系之间为刚体变换的关系:

在这里插入图片描述

其中 [ R T 0 1 ] = [ r 11 r 12 r 13 t 1 r 21 r 22 r 23 t 2 r 31 r 32 r 33 t 3 0 0 0 1 ] \begin{bmatrix} R & T\\ 0 & 1 \end{bmatrix} = \begin{bmatrix} r_{11} & r_{12} & r_{13} & t1 \\ r_{21} & r_{22} & r_{23} & t2 \\ r_{31} & r_{32} & r_{33} & t3 \\ 0 & 0 & 0 & 1 \end{bmatrix} [R0?T1?]=?????r11?r21?r31?0?r12?r22?r32?0?r13?r23?r33?0?t1t2t31??????

R、T 与摄像机无关,所以称这两个参数为摄像机的外参数 (extrinsic parameter)

下面详细介绍下外参矩阵

因为世界坐标系和像机坐标系都是右手坐标系,所以其不会发生形变。我们想把世界坐标系下的坐标转换到像机坐标下的坐标,如下图所示,可以通过刚体变换的方式。空间中一个坐标系,总可以通过刚体变换转换到另外一个个坐标系的。
在这里插入图片描述
其中, X C X_C XC? 代表摄像机坐标系, X X X 代表世界坐标系。 R R R 代表旋转(因其受 x,y,z 三个方向上的分量共同控制,所以其具有三个自由度), T T T 代表平移

在这里插入图片描述

5 实践中,相机世界坐标系的指定

在实践中,世界坐标系的选取可分为两种情况,单目相机与双目相机。

1,单目相机

在单目相机中,我们通常选择拍摄第一张图像时的相机坐标系作为世界坐标系,即以拍摄第一张图像时相机的光心(小孔)作为原点,X 轴为水平方向,Y 轴为竖直方向,Z 轴指向拍摄第一张图像时相机所观察的方向。选定后世界坐标系便不再发生变化,即不变且唯一。

2,双目相机

在双目相机 (A,B) 中,与单目相机大同小异,我们可选取其中一个相机 A 拍摄第一张图像时的相机坐标系为世界坐标系,即以相机 A 拍摄第一张图像时相机的光心(小孔)作为原点,X 轴为水平方向,Y 轴为竖直方向,Z 轴指向拍摄第一张图像时相机 A 所观察的方向。

这样的话 A 相机的 R 为单位矩阵,T 为零向量

6 附录

这里简单的提及一些 opencv 库方法

1)findChessboardCorners 和 drawChessboardCorners

找标定网格的角点,注意输入需要是灰度图

import cv2
img = cv2.imread(image)
h, w, _ = img.shape
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray,(w,h),None) # 找角点, w 和 h 是标定表格每行每列的角点个数
cv2.drawChessboardCorners(img,(w,h), corners, ret) # 画角点

在这里插入图片描述
参考 python+OpenCV 相机标定

2)getAffineTransform

根据两张图的三个对应点,求仿射变换矩阵
在这里插入图片描述

M = cv2.getAffineTransform(InputArray src, InputArray dst)
  • InputArray src:图1的三个点, np.float32([[],[],[]])
  • InputArray dstL:图2的三个点, np.float32([[],[],[]])
  • M:把图1 转化成图 2 所需的仿射变换矩阵,维度是 2x3

3)warpAffine

对图片做变换生成新的图片

cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst
  • src - 输入图像。
  • M - 变换矩阵。
  • dsize - 输出图像的大小,(w, h)
  • flags - 插值方法的组合(int 类型!)cv2.xxx
  • borderMode - 边界像素模式(int 类型!)cv2.xxx
  • borderValue - (重点!)边界填充值; 默认情况下,它为0
  • dst - 输出图像

参考 OpenCV 之 cv2.getAffineTransform + warpAffine

下面具体看看 flagsborderMode 有哪些可供选择的

4)插值

插值方法,cv2.xxx opencv中插值算法详解
在这里插入图片描述

5)填充

填充方法 python-opencv 图像通道分离,合并,边界扩展
在这里插入图片描述

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-12-18 15:58:47  更:2021-12-18 16:02:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 0:23:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码