单目视觉标定原理

本文详细介绍了计算机视觉中的相机标定原理,包括三大坐标系(图像坐标系、相机坐标系、世界坐标系)之间的转换关系,以及相机模型中的线性与非线性模型。此外还探讨了如何通过标定获取相机的内外参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在计算机视觉中,通过相机标定能够获取一定的参数,其原理是基于三大坐标系之间的转换和摄像机的畸变参数矩阵。在实验中经常用张正友标定发,进行摄像机标定,获取到内参数矩阵和外参数矩阵以及畸变参数矩阵。在应用中要区分三者作用。这也是在程序中函数输入量。

一、三大坐标系

在计算机视觉中,利用图像中目标的二维信息获取目标的三维信息,肯定需要相机模型的之间转化。

1、图像坐标系

在计算机系统中,描述图像的大小是像素,比如图像分辨率是1240*768.也就就是以为图像具矩阵rows是1024,cols是768.那图像的原点是在图像的左上角。

clip_image001

以图像左上角为原点建立以像素为单位的直接坐标系u-v。像素的横坐标u与纵坐标v分别是在其图像数组中所在的列数与所在行数。这是像素坐标,而不是物理坐标,为了后续的模型转换,有必要建立图像坐标系。

图像坐标系是以图像中心为原点,X轴和u轴平行,Y轴和v轴平行。dx和dy标示图像中每个像素在X轴和Y轴的物理尺寸,其实就是换算比例。比如图像大小是1024*768,图像坐标系x-y中大小为19*17.那么dx就是19/1024.

则图像中的每个像素在u-v坐标系中的坐标和在x-y坐标系中的坐标之间都存在如下的关系:

40652696_2.jpg

(上述公式中我们假设物理坐标系中的单位为毫米,那么dx的的单位为:毫米/像素。那么x/dx的单位就是像素了,即和u的单位一样都是像素)

为了使用方便,可将上式用齐次坐标与矩阵形式表示为:

40652696_3.jpg

其逆关系可表示为:

40652696_4.jpg

比如我们知道图像分辨率是1024*768,此时像素为(100,50),图像坐标系为是19*17mm。那么在图像坐标系是多少

根据转化和平移关系,知道U0为1024/2 = 512,v0位768/2 = 384.代入公式为x= (100-512)*19/1024.实际中图像坐标系还是比较容易获取。这是需要初始化,就能获取到的参数。

2、相机坐标系

a、相机坐标系概念


 

相机成像的几何关系可由图2.2表示。其中O点为摄像机光心(投影中心),Xc轴和Yc轴与成像平面坐标系的x轴和y轴平行,Zc轴为摄像机的光轴,和图像平面垂直。光轴与图像平面的交点为图像的主点O1,由点O与Xc,Yc,Zc轴组成的直角坐标系称为摄像机的坐标系。OO1为摄像机的焦距。

40652696_5.jpg

 

b、相机坐标系和图像坐标系之间的关系

在模型中我们将图像坐标放在相机坐标系前方,如图所示,两者之间的转化关系是有透镜原理获取的。

40652696_7.jpg

根据相似三角形的原理。X = (X/Z)*f。所以相机的焦距也是很重要的参数。y的获取同样道理。

实际中往往不会这么精确,会存在误差。

1、在实际中主点不一定在成像仪(图像平面)的中心,为了对光轴可能存在的偏移进行建模,我们引入两个新的参数:cx和cy。

2、在实际中,由于单个像素的在低价的成像仪上是矩形而不是正方形,我们引入了两个不同的焦距参数:fx和fy。(这里的焦距是以像素为单位)

则,我们假定物体在相机坐标系统中的点Q,其坐标为(X,Y,Z),以某些偏移的方式投影为点q(xsrceen,yscrreen),其中srceen为下表,坐标关系如下:

  • 40652696_8.jpg

fx,fy和物理焦距F之间的关系为:fx=Fsx和fy=Fsy。其中sx表示x方向上的1毫米长度所代表像素值,即单位像素/每毫秒,fx,fy是在相机标定中整体计算的,而不是通过该公式计算的。

3、世界坐标系

世界坐标系是为了描述相机的位置而被引入的,如图2.2中坐标系OwXwYwZw即为世界坐标系。平移向量t和旋转矩阵R可以用来表示相机坐标系与世界坐标系的关系。所以,假设空间点P在世界坐标系下的齐次坐标是(Xw,Yw,Zw,1)T,(这里T是上标转置),在相机坐标下的齐次坐标是(Xc,Yc,Zc,1)T,则存在如下的关系:

上式中R是3×3的正交单位矩阵(也成为旋转矩阵),t是三维的平移向量。矢量0=(0,0,0),M1是4×4矩阵。

在实验中,比如我们设定经纬坐标是(48,42,15)的为世界坐标系的原点,X方向指向正北。但是在试验场中点(46,40,5)是相机坐标的系的原点,方向是正东。那么两者之间就存在一个转换关系。

1、旋转矩阵R:

通常,任何维的旋转可以表示为坐标向量与合适尺寸的方阵的乘积。最终一个旋转等价于在另一个不同坐标系下对点位置的重新表述。坐标系旋转角度θ,则等同于目标点绕坐标原点反方向旋转同样的角度θ。图11-8显示了矩阵乘法对二维旋转的描述。在三维空间中,旋转可以分解为绕各自坐标轴的二维旋转(例如图11-8就是绕z轴旋转),其中旋转的轴线的度量保存不变(这就是为什么旋转矩阵为正交矩阵的缘由)。如果依次绕x,y,z轴旋转角度ψ,φ和θ,那么总的旋转矩阵R是三个矩阵Rx(ψ),Ry(φ),Rz(θ)的乘积,其中:

因此R=Rx(ψ),Ry(φ),Rz(θ).在绕X轴旋转时,到YZ的平面距离没有变化,所以X坐标没有变化,只是YZ坐标需要诚意旋转系数,其他矩阵同理。这个需要记住即可

image

平移向量T:

平移向量用来表示怎么样将一个坐标系的原点移动到另外一个坐标系的原点,或者说平移向量是第一个坐标系原点与第二个坐标系原点的偏移量。因此,从以目标中心为原点的坐标系移动到以摄像机为中心的原点的另外一个坐标系,相应的平移向量为T=目标原点—摄像机原点。那么点在世界坐标系的中的坐标Po到在摄像机坐标系中Pc:

Pc=R(Po-T)

故,用三个角度ψ,φ和θ表示三维旋转,用三个参数(x,y,z)表示三维平移,共6个参数,对摄像机而言,OpenCV内参数矩阵有4个参数:fx,fy,cx,cy。故对于每一个视场的解需要10个参数。我们知道一个四边形的4个点可以提供8个方程,故至少需要两个视角才能解出全部几何参数。8*2=6+6+4。

二、相机模型

在计算机视觉中通过相机模型讲三维空间的点和二维图像中的点联系起来。如果不考虑畸变的原因,则是线性模型,如果考虑,则是非线性模型。

1、线性模型

可用针孔模型来近似表示任一点P(Xc,Yc,Zc)在像平面的投影位置,也就是说,任一点P(Xc,Yc,Zc)的投影点p(x,y)都是OP(即光心(投影中心)与点P(Xc,Yc,Zc)的连线)与像平面的交点如上一篇文章中的图2.2。对应比例关系可得:

(说明:Xc的c下表表示camera相机,上述公式是在相机坐标系内,利用三角形相似原理,即x/f=Xc/Z,其中上述公式的单位为毫米,f表示焦距单位毫米)

上式可以用齐次坐标与矩阵的形式表示为:

将上一篇文章中的(2.3)和(2.4)代入(2.6)式就可以得到点P的世界坐标与其投影坐标(u,v)之间的关系为:

(说明:上述公式中完成了从世界坐标系到图像坐标系的转变,中间经过了相机坐标系的过度,Xw中的w表示world世界,单位为毫米,而u,v是的 单位为像素,即完成了从毫米——像素的转换。)

其中ax=f/dx,ay=f/dy;M是3×4的矩阵—投影矩阵,M1完全由相机的内参数ax,ay,u0,v0决定,(u0,v0)为主点坐标,ax,ay分别表示图像u轴和v轴上的尺度因子,M2则完全由相机的外部参数决定。而相机标定就是确定相机的内外参数。

由式(2.7)可知,若已知相机的内外参数,则相当于已知投影矩阵M.当已知M和空间点P的坐标:矢量Xw=(Xw,Yw,Zw,1)T,(矢量Xw上面有一个矢量标识杠,T表示矢量的转置)。式(2.7)可以给出三个方程,消去Zc就可以得到其投影点p的坐标(u,v)(其实也就是我用一个相机就可以拍摄一个物体的图片了)。但是由于M为3×4不可逆矩阵,当 点P的投影坐标(u,v)和投影矩阵M为已知时,我们只能得到关于Xw,Yw,Zw的两个线性方程,即射线OP的方程,由上一篇图2.2我们可以看出,位于射线OP上的所有空间点的投影点(即图像点)都是p点。所以不能唯一确定空间点P的世界坐标矢量Xw.

2、非线性模型

1、径向畸变

现实中第一是由于成像平面和透镜平面不死绝对平行的,所以存在径向畸变。对径向畸变成像仪中心是畸变为0,越到边缘畸变越严重,比如鱼眼透镜。

对于便宜的网络摄像机,我们通常使用前两项,其中通常第一项为k1,而第二项为k2。对畸变很大的摄像机,比如鱼眼透镜,我们使用第三个径向畸变项k3。通常成像仪某点的径向位置按下式调节:

这里(x,y)是畸变点在成像仪上的原始位置,(xcorrected,ycorrected)表示矫正后的新位置。

2、切向畸变

切向畸变是由于透镜制造上的缺陷使得透镜本身与图像平面不平行而产生的。径向畸变可以有两个额外的参数p1和p2来描述,如下:

因此总共有5个我们需要的畸变参数。由于在OpenCV程序中5个参数是必需的,所以它们被放置到一个畸变向量中,这是一个5×1的矩阵,按顺序依次包含k1,k2,p1,p2和k3。

0_1287878651oVd3.gif

在实际的成像过程中,考虑镜头的失真,一般都存在非线性畸变,所以线性模型不能准确描述成像几何关系。非线性畸可用下列公式描述:

若考虑非线性畸变,则对相机标定时需要使用非线性优化算法。而有研究表明引入过多的非线性参入(如离心畸变和薄棱畸变)不仅不能提高精度,还会引起解的不稳定。一般情况下径向畸变就足以描述非线性畸变,所有本课题只是考虑径向畸变。则将式(2.9)中的径向畸变代入式(2.8)可得:

单个摄像头的定标主要是计算出摄像头的内参(焦距f和成像原点cx,cy、 五个畸变参数(一般只需要计算出k1,k2,p1,p2,
对于鱼眼镜头等径向畸变特别大的才需要计算k3))以及外参 (标定物的世界坐标)。

所以,为了得到空间物体的三维世界坐标,就必须有两个或更多的相机构成立体视觉系统模型才能实现。

三 、单目标定矩阵关系

根据前面两章节的介绍,描述了坐标系之间的转化,同时也讲解了畸变矩阵的由来。那如果获取到图像中二维坐标,如何获取到现实中三维坐标呢?当然单目摄像机无法获取三维坐标,但能反映一定关系。综上来讲,矩阵变换公式为:

40396658_5.gif

40396658_6.gif

根据坐标系之间转化和相机模型(线性和非线性模型),研究了极几何及基本矩阵的知识,证明了基本矩阵是求得摄像机投影矩阵的关键,根据基本矩阵F和摄像机标定阶段获取的内参数矩阵K,计算得到本质矩阵E,通过对E进行奇异值分解求得外参数矩阵R,T,接着求出投影矩阵P1和P2.

转载于:https://www.cnblogs.com/polly333/p/4994408.html

<think>首先,用户的问题是:“我想查找关于单目视觉标定的技术资料或方法请问单目相机视觉标定方法教程”,意思是他们想要关于单目相机视觉标定的技术资料或方法教程。根据系统级指令,我需要:-所有行内数学表达式使用$...$格式。-独立公式使用$$...$$格式并单独成段。-LaTeX语法正确。-使用中文回答。-生成相关问题。-在回答中引用的段落末尾自然地添加引用标识,例如[^1]。-参考站内引用:[1]到[4]提供的信息。站内引用内容:-[^1]:讨论了单目相机标定的基本概念、意义、小孔成像原理、坐标系转换。包括相机内参(焦距)、外参(旋转矩阵)、畸变参数。-[^2]:提到了单目相机综述的链接。-[^3]:讨论了相机外参标定方法,如使用消失点或联合标定。-[^4]:描述了使用Extractgridcorners提取角点的操作步骤。用户的需求是方法教程,所以我需要提供单目相机视觉标定的方法步骤。结构化我的回答:1.**介绍单目相机标定**:简要解释是什么和为什么重要。2.**方法教程**:提供主要的方法步骤。参考引用[^1]和[^4],可以涵盖张正友标定法(Zhang'sMethod),因为它是常见的。3.**详细步骤**:包括准备标定板、图像采集、特征提取、参数计算、优化等。4.**实例或代码**:参考引用[^2]和Opencv实现。5.**相关问题生成**:在结尾添加相关问题。确保回答清晰、逐步解决。回答中使用中文。生成相关问题:例如,关于标定工具、优化方法、应用场景等。LaTeX:-行内数学表达式:如相机内参$f_x,f_y$。-独立公式:如果需要,例如畸变模型。-例如,针孔相机模型:$$s\begin{pmatrix}u\\v\\1\end{pmatrix}=\begin{pmatrix}f_x&0&c_x\\0&f_y&c_y\\0&0&1\end{pmatrix}\begin{pmatrix}R&t\\0^T&1\end{pmatrix}\begin{pmatrix}X_w\\Y_w\\Z_w\\1\end{pmatrix}$$-引用标识:自然地添加在参考部分。内容大纲:1.解释单目相机标定的意义:基于[^1]。2.主要方法:张正友标定法(Zhang'sMethod)。3.步骤教程:a.准备标定板:如棋盘格。b.采集图像。c.检测角点:使用OpenCV函数,如cv2.findChessboardCorners。d.优化角点:如cv2.cornerSubPix。e.计算相机参数:内参、外参、畸变参数。f.评估结果。4.实例:提到OpenCV实现。5.其他方法:简要提及其他方法如基于消失点的标定[^3]。6.引用:自然地添加。相关问题建议:1.单目相机标定的常见工具有哪些?2.如何优化标定精度?3.单目相机在SLAM中的应用是什么?最终回答结构:-标题(可选)。-介绍。-方法教程分步骤。-注意事项。-相关问题。</think> ### 单目相机视觉标定方法教程 单目相机视觉标定是确定相机内部参数(焦距、主点坐标等)、外部参数(旋转矩阵、平移向量)和畸变参数的过程,以建立从三维世界到二维图像的精确映射关系。这项技术在机器人导航、三维重建和增强现实等领域具有重要应用。张正友标定法(Zhang's Method)是目前最常用、易于实现的方法之一,它以棋盘格标定板为基础,结合计算机视觉库(如OpenCV)实现。以下我基于参考引用的内容,结合常见实践,提供一个详细、逐步的单目相机视觉标定教程。 #### 1. **准备标定板和图像采集** 首先,你需要一个高精度的棋盘格标定板(通常为黑白格子的对称模式)。标定板的物理尺寸(如每个方格的边长)必须精确测量。 - **步骤**: - 准备一个棋盘格标定板(例如,8×8或9×6网格),确保方格均匀、边缘清晰。参考[^4],方格物理尺寸设为dx=dy=30mm(常用尺寸)。 - 用相机从不同角度(例如,前视、侧视、斜视等)采集多张图像(至少10-15张)。图像应覆盖整个视场范围,以保证参数计算的全面性。注意:相机光圈固定、光照均匀,避免模糊。 - 图像保存为常见格式(如.jpg或.png),便于后续处理。 #### 2. **检测和提取角点** 角点是标定板上的网格交点点。使用OpenCV的`findChessboardCorners`函数自动检测这些点,并结合`cornerSubPix`优化位置精度。 - **步骤**: - 加载采集的图像序列。 - 应用`cv2.findChessboardCorners()`函数检测棋盘格角点,设置网格尺寸(如(9,6))。 - 优化角点位置:调用`cv2.cornerSubPix()`函数,设置角点检测窗口大小(参考[^4],常用5×5像素),提高亚像素级精度。示例: ```python import cv2 import numpy as np # 加载图像 image = cv2.imread('calib_image.jpg') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 定义棋盘格大小 (宽度, 高度) pattern_size = (9, 6) ret, corners = cv2.findChessboardCorners(gray, pattern_size, None) # 优化角点 if ret: criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) corners_refined = cv2.cornerSubPix(gray, corners, (5,5), (-1,-1), criteria) cv2.drawChessboardCorners(image, pattern_size, corners_refined, ret) cv2.imshow('Corners', image) cv2.waitKey(0) ``` - 参考[^4],这一步需要确保角点检测正确(如图像显示角点连接成网格),否则手动调整或重拍图像。多个图像需重复此过程。 #### 3. **计算相机参数** 通过检测到的角点,使用最小二乘优化求解相机内参、外参和畸变参数。OpenCV的`calibrateCamera`函数封装了这个过程。 - **数学模型**: - 相机投影模型(针孔模型)描述了世界坐标到像素坐标的转换: $$ s \begin{pmatrix} u \\ v \\ 1 \end{pmatrix} = \mathbf{K} \begin{pmatrix} \mathbf{R} & \mathbf{t} \end{pmatrix} \begin{pmatrix} X_w \\ Y_w \\ Z_w \\ 1 \end{pmatrix} $$ 其中,$s$是尺度因子,$\mathbf{K}$是内参矩阵(包含焦距$f_x, f_y$和主点$c_x, c_y$),$\mathbf{R}$和$\mathbf{t}$是旋转矩阵和平移向量(外参),$(X_w, Y_w, Z_w)$是世界坐标。 - 畸变模型包含径向畸变($k_1, k_2, k_3$)和切向畸变($p_1, p_2$),用于校正图像扭曲。 - **步骤**: - 准备对象点(object points):基于标定板的物理尺寸,生成世界坐标系中的三维点坐标(例如,每个角点位置)。 - 调用`cv2.calibrateCamera()`函数: ```python # 生成对象点(世界坐标系) objp = np.zeros((pattern_size[0]*pattern_size[1], 3), np.float32) objp[:,:2] = np.mgrid[0:pattern_size[0],0:pattern_size[1]].T.reshape(-1,2) * 30 # 30mm为方格尺寸 # 存储所有图像的点集 obj_points = [] # 世界坐标点 img_points = [] # 图像坐标点 # 循环处理每张图像 for image_file in image_list: # 检测和优化角点(步骤2) # ... obj_points.append(objp) img_points.append(corners_refined) # 计算相机参数 ret, K, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera( obj_points, img_points, gray.shape[::-1], None, None ) print("内参矩阵 K:\n", K) print("畸变参数:", dist_coeffs) ``` - 输出包括内参矩阵(K)、畸变系数(dist_coeffs)和每个图像的外参(rvecs, tvecs)。参考[^1],这帮助恢复三维信息。 #### 4. **评估和校正标定结果** 标定后需评估重投影误差(reprojection error),确保参数准确。 - **步骤**: - 计算重投影误差:误差值应小于0.5像素(越低越好)。 ```python # 计算重投影误差 mean_error = 0 for i in range(len(obj_points)): img_points2, _ = cv2.projectPoints(obj_points[i], rvecs[i], tvecs[i], K, dist_coeffs) error = cv2.norm(img_points[i], img_points2, cv2.NORM_L2) / len(img_points2) mean_error += error print("平均重投影误差: {:.5f} 像素".format(mean_error/len(obj_points))) ``` - 畸变校正:使用`cv2.undistort()`函数对图像去畸变。 ```python undistorted = cv2.undistort(image, K, dist_coeffs, None) cv2.imshow('Undistorted', undistorted) ``` - 如果误差高,返回步骤1或增加图像数量。 #### 5. **其他方法和注意事项** - **张正友标定法优势**:无需精确标定板位置,操作简单,OpenCV内置支持(参考[^2])。 - **备选方法**: - **消失点标定法**:适用于有平行线场景(如车道线),通过计算消失点求解外参(参考[^3])。 - **联合标定法**:与激光雷达等传感器结合,提高精度,可用工具如autoware(参考[^3])。 - **Tips**: - **精度优化**:使用更多图像(20+张)、确保标定板纹理清晰、图像覆盖全视野。 - **工具推荐**:OpenCV(Python/C++版)是主要工具;MATLAB Camera Calibrator App更易用于新手。 - **应用**:标定后用于三维重建或SLAM(参考[^1]),如获取深度信息($distance = f \times \frac{object\_size}{image\_size}$)。 参考资源: - 张正友原始论文:"A Flexible New Technique for Camera Calibration",1999。 - OpenCV教程:[官方文档](https://docs.opencv.org/4.x/dc/dbb/tutorial_py_calibration.html)或参考[^2]链接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值