在这里插入图片描述

汇总整理摘抄自



1、概念

什么是“相机标定”?

百科解释:在图像测量过程以及机器视觉应用中,为确定空间物体“表面某点的位置”与其在“图像中对应点”的关系,必须建立相机成像的几何模型,求解几何模型相关参数的过程就称之为相机标定。

简单来讲就是:我们生活的场景是三维的、立体的,相机拍摄出来的东西是二维的、平面的。二维相较于三维来说,缺少了距离/深度等重要信息,要想从二维的图片当中获取物体原本在三维当中的位置和形态,就需要通过一系列的复杂算法去达到这个目的,这个算法的整体过程就叫相机标定。

核心技术丨何为“相机标定”?我们用它做了什么?

机器视觉的相机标定到底是什么? - temp的回答 - 知乎

在这里插入图片描述

Q & A
在这里插入图片描述

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

2、坐标系简介

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

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

  • 像素平面坐标系 ( 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)

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

在这里插入图片描述

在这里插入图片描述

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

3、图像物理坐标系与像素坐标系

图像物理坐标系 ( 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的单位为像素。

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

在这里插入图片描述

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

相机坐标系 ( 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 为:

在这里插入图片描述

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

世界坐标系 ( 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} [R0T1]= r11r21r310r12r22r320r13r23r330t1t2t31

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

下面详细介绍下外参矩阵

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

在这里插入图片描述

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

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

1,单目相机

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

2,双目相机

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

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


eg:

相机内参矩阵 (Intrinsic Matrix)

内参矩阵 K K K 描述了相机坐标系到像素坐标系的投影关系。

左相机内参 K 1 K1 K1:

K 1 = [ 607.443 0 311.687 0 607.428 251.545 0 0 1 ] K1 = \begin{bmatrix} 607.443 & 0 & 311.687 \\ 0 & 607.428 & 251.545 \\ 0 & 0 & 1 \end{bmatrix} K1= 607.443000607.4280311.687251.5451

右相机内参 K 2 K2 K2:

K 2 = [ 612.089 0 298.791 0 612.242 282.027 0 0 1 ] K2 = \begin{bmatrix} 612.089 & 0 & 298.791 \\ 0 & 612.242 & 282.027 \\ 0 & 0 & 1 \end{bmatrix} K2= 612.089000612.2420298.791282.0271

在原始内参中, f x f_x fx f y f_y fy 约为 607-612 之间。


相机外参矩阵 (Extrinsic Matrix)

外参描述了右相机相对于左相机的空间位姿,由旋转矩阵 R R R 和平移向量 T T T 组成:

旋转矩阵 R R R:

R = [ 0.999998 − 0.000065 0.001918 0.000067 0.999999 − 0.000759 − 0.001918 0.000759 0.999998 ] R = \begin{bmatrix} 0.999998 & -0.000065 & 0.001918 \\ 0.000067 & 0.999999 & -0.000759 \\ -0.001918 & 0.000759 & 0.999998 \end{bmatrix} R= 0.9999980.0000670.0019180.0000650.9999990.0007590.0019180.0007590.999998

平移向量 T T T (单位: mm):

T = [ − 65.034 0.090 0.385 ] T = \begin{bmatrix} -65.034 \\ 0.090 \\ 0.385 \end{bmatrix} T= 65.0340.0900.385

基线 B B B (单位: mm)
在这里插入图片描述


附录A

A1、opencv 库

这里简单的提及一些 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 图像通道分离,合并,边界扩展
在这里插入图片描述
OpenCV库成员——BorderTypes


OpenCV基础(28)使用OpenCV进行摄像机标定Python和C++

在这里插入图片描述

在这里插入图片描述
相机标定代码

#!/usr/bin/env python

import cv2
import numpy as np
import os
import glob

# 定义棋盘格的尺寸
CHECKERBOARD = (6,9)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)

# 创建向量以存储每个棋盘图像的 3D 点向量
objpoints = []
# 创建向量以存储每个棋盘图像的 2D 点向量
imgpoints = [] 


# 定义 3D 点的世界坐标
objp = np.zeros((1, CHECKERBOARD[0] * CHECKERBOARD[1], 3), np.float32)
objp[0,:,:2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2)
prev_img_shape = None

# 提取存储在给定目录中的单个图像的路径
images = glob.glob('./images/*.jpg')
for fname in images:
    img = cv2.imread(fname)
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    # 找到棋盘角
    # 如果在图像中找到所需数量的角,则 ret = true
    ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD, cv2.CALIB_CB_ADAPTIVE_THRESH + cv2.CALIB_CB_FAST_CHECK + cv2.CALIB_CB_NORMALIZE_IMAGE)
    
    """
    如果检测到所需数量的角, 我们细化像素坐标并可视化
    """
    if ret == True:
        objpoints.append(objp)
        # 细化给定二维点的像素坐标。
        corners2 = cv2.cornerSubPix(gray, corners, (11,11),(-1,-1), criteria)
        
        imgpoints.append(corners2)

        # 绘制并显示角
        img = cv2.drawChessboardCorners(img, CHECKERBOARD, corners2, ret)
    
    cv2.imshow('img',img)
    cv2.waitKey(0)

cv2.destroyAllWindows()

h,w = img.shape[:2]

"""
通过传递已知 3D 点 (objpoints) 的值 和检测到的角点(imgpoints)对应的像素坐标 实现相机标定
"""
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)

print("Camera matrix : \n")
print(mtx)
print("dist : \n")
print(dist)
print("rvecs : \n")
print(rvecs)
print("tvecs : \n")
print(tvecs)

其中 objp 的值为

array([[[0., 0., 0.],
        [1., 0., 0.],
        [2., 0., 0.],
        [3., 0., 0.],
        [4., 0., 0.],
        [5., 0., 0.],
        [0., 1., 0.],
        [1., 1., 0.],
        [2., 1., 0.],
        [3., 1., 0.],
        [4., 1., 0.],
        [5., 1., 0.],
        [0., 2., 0.],
        [1., 2., 0.],
        [2., 2., 0.],
        [3., 2., 0.],
        [4., 2., 0.],
        [5., 2., 0.],
        [0., 3., 0.],
        [1., 3., 0.],
        [2., 3., 0.],
        [3., 3., 0.],
        [4., 3., 0.],
        [5., 3., 0.],
        [0., 4., 0.],
        [1., 4., 0.],
        [2., 4., 0.],
        [3., 4., 0.],
        [4., 4., 0.],
        [5., 4., 0.],
        [0., 5., 0.],
        [1., 5., 0.],
        [2., 5., 0.],
        [3., 5., 0.],
        [4., 5., 0.],
        [5., 5., 0.],
        [0., 6., 0.],
        [1., 6., 0.],
        [2., 6., 0.],
        [3., 6., 0.],
        [4., 6., 0.],
        [5., 6., 0.],
        [0., 7., 0.],
        [1., 7., 0.],
        [2., 7., 0.],
        [3., 7., 0.],
        [4., 7., 0.],
        [5., 7., 0.],
        [0., 8., 0.],
        [1., 8., 0.],
        [2., 8., 0.],
        [3., 8., 0.],
        [4., 8., 0.],
        [5., 8., 0.]]], dtype=float32)

A2、快门 / 光圈 / 感光度

来自 快门速度、光圈、ISO(感光度)

在这里插入图片描述
一个大的光圈(大开口)会通过较多的光线,从而得到更加明亮的照片。小光圈则相反,得到的照片要更暗一点。下图展示了光圈是如何影响曝光的。
在这里插入图片描述
光圈变大,景深变小;光圈变小,景深变大。下图展示了使用大光圈和小光圈的区别:

在这里插入图片描述

从最基本的来说,ISO 是一种可以使照片变亮或变暗的相机设置。随着 ISO 值的增加,照片会逐渐变亮。 因此,ISO 可以在较暗的环境中拍摄图像,或者更灵活地设置光圈和快门速度。
在这里插入图片描述
在这里插入图片描述
提高 ISO 是有后果的。在过高的 ISO 下拍摄的照片会显示很多颗粒,也就是噪音,这可能会导致照片无法使用

A3、消除畸变

来自

双目标定 --> 立体校正(含消除畸变) --> 立体匹配 --> 视差计算 --> 深度计算/3D坐标计算

畸变校正

光线经过相机的光学系统往往不能按照理想的情况投射到传感器上,也就是会产生所谓的畸变。畸变有两种情况:一种是由透镜形状引起的畸变称之为径向畸变

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

在相机的组装过程中由于不能使得透镜和成像面 严格平行也会引入切向畸变
在这里插入图片描述
在这里插入图片描述

其中 r 2 = x 2 + y 2 r^{2} = x^{2} + y^{2} r2=x2+y2,x 和 y 均为归一化平面坐标,因此需要得畸变参数总共有5个:
在这里插入图片描述

通常来说有这 5 个畸变系数就足够了,对于某些相机来说可能还需要更高阶的参数才能够更精确地建模图像畸变:
在这里插入图片描述

其中 s1, s2, s3, s4 是 thin prism distortion coefficients,通过标定可以获得以上所有的畸变参数。opencv 提供了相应的函数做畸变校正

# brief: 消除畸变
# image: 输入图像
# camera_matrix: 相机内参矩阵
# dist_coeff: 相机内参矩阵
undistortion_image = cv2.undistort(image, camera_matrix, dist_coeff)

在这里插入图片描述

A4、摄像头镜头焦距和监控距离的关系

http://www.360doc.com/content/19/1221/23/3071845_881285502.shtml

在这里插入图片描述

附录 B

B.1、结构光原理

学习摘抄来自 系列篇|结构光三维重建基本原理

双目标定
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
结构光(把投影仪看做相机)
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

B.2、单目结构光三维成像系统的标定方法

学习摘抄来自 系列篇|单目结构光三维成像系统的标定方法

投影仪如何标定?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
PS:

在这里插入图片描述
来自百度百科

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

在这里插入图片描述

B.3、圆环vs棋盘

在这里插入图片描述

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐