激光三角测距原理
- 1. 简介
-
- 1.1 Halcon基础
- 1.2 激光三角法测量系统
- 2. 直射式激光三角测距法
- 3. 斜射式激光三角测距法
- 3. 工作原理
-
- 3.1 功能
- 3.2 普通面阵相机
- 3.3 线激光的选择
- 3.4 影响精度的因素
- 3.5 标定
-
- 3.5.1 原理介绍
- 3.5.2 标定目标及用途
- 3.5.2 使用Halcon标定板标定片光系统
- 3.6 提取光条中心
- 4. 计算3D点云
-
- 4.1 get_sheet_of_light_result
-
- 5. 坐标系
-
- 5.1 坐标系之间的关系
-
- 5.1.1 摄像机坐标系 ( O c X c Y c Z c ) (O_cX_cY_cZ_c) (OcXcYcZc)与世界坐标系 ( O w X w Y w Z w ) (O_wX_wY_wZ_w) (OwXwYwZw)(刚体变换)
- 5.1.2 摄像机坐标系 ( O c X c Y c Z c ) (O_cX_cY_cZ_c) (OcXcYcZc)与图像物理坐标系 ( o x y ) (oxy) (oxy) (相似三角形)
- 5.1.3 图像物理坐标系 ( o x y ) (oxy) (oxy)和图像像素坐标系 ( o o u v ) (o_ouv) (oouv) (离散化)
- 5.1.4 完整变换过程
- 5.1.5 镜头畸变
-
- 5.1.5.1 径向畸变
- 5.1.5.2 切向畸变
- 5.2 激光三角标定模型及原理(重要)
-
- 5.2.1 相机(内参和外参)标定原理
-
- 5.2.1.1 直接线性标定法(输入含三维信息)
- 5.2.1.2 Tsai的两步法相机标定
- 5.2.1.3 张氏标定法(输入不含三维信息)
- 5.2.1.4 OpenCV标定流程
- 5.2.2 光平面标定原理
-
- 5.2.3 激光扫描运动(移动位姿)标定原理
-
- 5.2.4 布局参数计算
- 5.3 点在两个不同坐标系中的坐标
- 5.4 3D世界坐标点转换为像素坐标
- 5.5 针孔相机的透视投影
- 5.6 相机外参(R, T)
- 5.7 投影
- 5.8 变换为像素坐标
- 6. Halcon标定
-
- 6.1 Halcon标定板
- 6.2 标定过程注意事项
- 6.3 两种标定模型对比
- 6.4 标定细节
-
- 6.4.1 在标定图像之一将标定板放置在测量平面上(相机位姿)
- 6.4.2 在一个单独图像中放置标定板在测量平面上(相机位姿)
- 6.4.3 利用已知的3D点和它们对应的图像点
- 6.5 标定后改变世界坐标系参考点方法
-
1. 简介






- 激光三角测量需标定的目标:
- 单目相机的内参和外参
- 激光线光平面位姿
- 移动位姿
- 镜头的畸变参数
- 相机与激光器之间的布局参数
- 相机与激光器之间的基线距离
- 标定视频教程
- 激光三角测量法是利用光线空间传播过程中的光学反射规律和相似三角形原理,在接收透镜的物空间与像空间构成相似三角形关系,同时利用边角关系计算出待测位移。根据入射激光和待测物体表面法线之间的夹角,可以将激光三角法测量分为 3种情况,直射斜收比较好。
- 无论是直射式还是斜射式激光三角测距法,均可实现对被测物体的高精度、非接触测量,但直射式分辨率没有斜射式高。
- Disparity Image:每一行由一幅光条图像转换而来,每一个像素灰度值对应一个光条中心点的纵坐标。
- 三维重建流程:
- 创建光平面模型,并且设置参数(相机内参、相机外姿、光平面外姿、移动位姿)
- 一系列的激光图像先后被处理
- 从模型中检索视差图像、分数图像、校准坐标 X、Y 和 Z 以及测量产生的 3D 对象模型
- 圆的标定精度比正方形的高,但圆有偏心误差(圆中心的投影不等于投影椭圆的中心),而正方形没有偏心误差,使用圆时,要解决偏心误差的问题。

- 偏心误差解决方案:Shen Y , Zhang X , Cheng W , et al. Quasi-eccentricity error modeling and compensation in vision metrology[J]. Measurement science and Technology, 2018, 29(4)

1.1 Halcon基础
-
image
- image 对象中包含了像元数据。
- 它本身可以是 tuple,含有一张或是多张影像,每个影像对象本身含有一个 domain,记载了面积,范围,以及一或多个频道的灰度值数据,而频道的数目没有限制,一个单色影像只有一个频道,一般的全彩影像有三个(RGB),多光谱影像可能就更多。

-
region
- 记载了影像中的特定区域数据,例如说影像中明亮的部分,region 对象中可含有一个以上的区域数据,这些数据是彼此互相独立的,而且即使记载了某张影像的区域,这些数据和影像本身并非直接相关。这种设计使得 region 的资料可以是任意形状尺寸,而且储存时非常有效率。在内存中的 region 数据和影像灰阶数据是分离的,即使 region 有互相重迭时,内存中的影像数组不会受到任何影响。

-
XLD
- XLD是 eXtended Line Description 的缩写,这种数据结构用于纪录区域,例如任意尺
寸的区域或是多边型,开放或是封闭的等值线,直线等等。和 region 对象不同的,region 的
纪录精度是以像元为单位,而XLD对象以次像元精度来记录。XLD对象有两种基本结构,
等值线和多边型。
XLD 对象的建立方法是由线(等值线,边缘等等)上的取样点连接而成,藉由改变取样密度和
位置,可以提高精度,此外还包含了角度,弪度等等数据。一般来说,XLD 记录了边缘侦测
计算的结果
1.2 激光三角法测量系统
2. 直射式激光三角测距法
- 当激光光束垂直入射被测物体表面,即入射光线与被测物体表面法线共线时,为直射式激光三角法。

- 目标:求物体到激光器的距离 d = A O d=AO d=AO
- 因为 △ A O B ∼ △ F B E \triangle AOB \sim \triangle FBE △AOB∼△FBE
- 所以
A O F B = A B F E ⇒ A O = A B ⋅ F B F E = B a s e ⋅ f x \frac{AO}{FB} = \frac{AB}{FE} \Rightarrow AO=\frac{AB \cdot FB}{FE} = \frac{Base \cdot f}{x} FBAO=FEAB⇒AO=FEAB⋅FB=xBase⋅f
- 物体距离激光器的距离: d = B a s e ⋅ f x d = \frac{Base \cdot f}{x} d=xBase⋅f
- 参数说明:
- B a s e = A B Base = AB Base=AB: 定义为激光器中心与CCD中心的距离
- f f f:为镜头的焦距
3. 斜射式激光三角测距法
- 当光路系统中,激光入射光束与被测物体表面法线夹角小于90°时,该入射方式即为斜射式。如下图所示的光路图为激光三角法斜射式光路图。
- 由激光器发射的激光与物体表面法线成一定角度入射到被测物体表面,反(散)射光经B处的透镜汇聚成像,最后被光敏单元采集。

- 参数说明:
- α α α: 入射光AO与基线AB的夹角为,
- B a s e = A B Base=AB Base=AB:激光器中心与CCD中心的距离
- f = B F f=BF f=BF:为透镜的焦距f,
- D D D:为被测物体距离基线无穷远处时反射光线在光敏单元上成像的极限位置
- D E = x DE=x DE=x:为光斑在光敏单元上偏离极限位置的位移
- 由光路图中的几何关系可知 △ A B O ∼ △ D E B \triangle ABO \sim \triangle DEB △ABO∼△DEB
- 所以:
A B D E = O C B F 且 A O = O C s i n α ⇒ \frac{AB}{DE} = \frac{OC}{BF} 且 AO = \frac{OC}{sin\alpha}\Rightarrow DEAB=BFOC且AO=sinαOC⇒
A O = A B ⋅ B F D E ⋅ s i n α = A B ⋅ f x ⋅ s i n α AO = \frac{AB \cdot BF}{DE \cdot sin\alpha} = \frac {AB \cdot f}{x \cdot sin\alpha} AO=DE⋅sinαAB⋅BF=x⋅sinαAB⋅f
- 在确定系统的光路时,可将CCD位置传感器的一个轴与基线AB平行(假设为y轴),则由通过算法得到的激光光点像素坐标为 ( P x , P y ) (P_x,P_y) (Px,Py)可得到x的值为:
x = C e l l S i z e ⋅ P x + D e v i a t i o n V a l u e x = CellSize \cdot P_x + DeviationValue x=CellSize⋅Px+DeviationValue
- 参数说明:
- CellSize: 光敏单元上单个像素的尺寸
- DeviationValue:是通过像素点计算的投影距离和实际投影距离x的偏差量
3. 工作原理
- 将一条单线细激光光线投射到物体表面,由于物体表面高度发生变化,使得激光线发生了弯曲,根据这个线的变形,可以计算出精确的物体表面三维轮廓。系统由以下几部分组成:
- 2D/3D相机
- 线激光(Line Laser)
- 镜头
- 固定架和安装方法


- 物体上的点到基线的距离:
d = l ⋅ s i n α ⋅ s i n a β s i n ( α + β ) d = \frac{l \cdot sin\alpha \cdot sina\beta}{sin(\alpha+\beta)} d=sin(α+β)l⋅sinα⋅sinaβ
3.1 功能
- 可以同时获得X,Z向坐标
- 相机与被测物之间必须有相对运行
- 主要用于在线3D测量
- 适合近距离、高精度、高速测量
3.2 普通面阵相机
- 使用普通面阵相机,需要自己提取轮廓线,并通过标定(获得相机内外参数、以及激光光平面的方向)来重建深度图像,Halcon里面有现成的例程进行实现。
- Halcon激光三角测量标定Demo(calibrate_sheet_of_light_calplate.hdev)包括了相机标定过程和激光标定过程。
3.3 线激光的选择
- 线激光的评价参数有很多,如均匀性、点稳定性、准直度、瞄准线、功率稳定性。激光器自身的参数有:扇角、功率、景深等。实际项目选型中,最常用的参数有:
- 扇角:扇角越大,同样工作距离对应的激光线越长。
- 功率:功率越高,激光的强度越大(肉眼看越亮)。对于黑色不反光材质,要选择功率大一点的激光。功率的稳定性也会影响测量的灵敏性,较差的功率稳定性,将不能使用固定的阈值方法,对于较低对比度的物体测量变得困难
- 均匀性:不好的均匀性会降低分辨率和精度
3.4 影响精度的因素
- 相机与激光器夹角(越大,精度越高)
- 相机视场角的大小(越小,精度越高)
- 被测物体的材质
3.5 标定
3.5.1 原理介绍
- 线激光条纹的变形程度反映了被测物体的高度变化,主要由相机(内参、外参)和相机与光平面之间的相对位置决定。
- 标定:求解这些参数的过程称为标定
3.5.2 标定目标及用途
- 标定目标:
- 相机内参和外参(WCS相对于相机坐标系的位姿)
- 激光光平面相对于世界坐标系(WCS)的位姿 (LightPlanePose)
- 标定物体相对于测量设备的运动(MovementPose,包括方向和速度)
- 标定用途:
3.5.2 使用Halcon标定板标定片光系统
- 相机内参(CameraParameters)
- 相机外参(CameraPose一般等于CameraPoseL,确定世界坐标系)
- 激光光平面位姿(LightPlanePose)
- 两个位置,4张图片
- 低位置的标定板图像,光条图像
- 1张标定板<标定相机外参>:CameraPoseL
- 1张光条打到标定板<曝光时间短,只看到光条>):Light_L.tif
- 高位置的标定板图像,光条图像
- 1张标定板<标定相机外参>:CameraPoseH
- 1张光条打到标定板<曝光时间短,只看到光条>):Light_H.tif
- 通过Light_L.tif, Light_H.tif, CameraPoseL, CameraPoseH, 相机内参计算出激光光平面的位姿。

- 移动位姿(MovementPose <只有平移>)
- 两张图片(移动了99步):
- 一张第1步的标定板图片:MoveStartCameraPose
- 另一张是第100步的标定板图片:MoveStopCameraPose
- 通过 MoveStartCameraPose,MoveStopCameraPose, 相机世界位姿,步数计算出MovementPose
- 将3D位姿(移动起始位姿、结束位姿、相机世界位姿)转换为齐次矩阵 (pose_to_hom_mat3d)
- 求逆(hom_mat3d_invert)
- [0, 0, 0] * hommot3D经=所求点 (affine_trans_point_3d)
- 求每一步的平移距离(movementPose)
3.6 提取光条中心
- 灰度重心法,一列一列地提取(要求光条尽量水平)
- 灰度重心法的步骤:
- 先设置阈值提取要处理的光条
- 一列一列地计算灰度中心,以灰度重心所在的坐标作为本列光条的中心坐标


- 灰度重心法计算公式:
{ u j = j v j = ∑ i i ⋅ G ( i , j ) ∑ i G ( i , j ) \begin{cases} u_j = j \\ v_j = \frac{\sum_{i} i \cdot G(i, j)}{\sum_i G(i, j)} \end{cases} {uj=jvj=∑iG(i,j)∑ii⋅G(i,j)
- G ( i , j ) G(i, j) G(i,j):光条图像中第 i i i行,第 j j j列的灰度值
- ( u j , u j ) (u_j, u_j) (uj,uj):提取到的光条中心的图像坐标
4. 计算3D点云
- 设置相机内参、外参、光平面位姿、移动位姿
- 建立ROI区域,减少计算量
- 建立SheetOfLight模型,并设置参数
- create_sheet_of_light_model
- set_sheet_of_light_param:
- calibration
- scale
- camera_parameter
- camera_pose
- lightplane_pose
- movement_pose
- score_type
- 连续读图,计算中心并保存
- measure_profile_sheet_of_light
- set_profile_sheet_of_light
- 获得四图一模型
- disparity图(get_sheet_of_light_result),每个点的灰度值为对应光条中对应点的中心值
- X图(get_sheet_of_light_result),每个点的灰度值为对应点的point.x,所有点的x坐标
- Y图(get_sheet_of_light_result),每个点的灰度值为对应点的point.y,所有点的y坐标
- Z图(get_sheet_of_light_result),每个点的灰度值为对应点的point.z,所有点的z坐标
- 模型(get_sheet_of_light_result_object_model_3d)
- 显示3D模型
- visualize_object_model_3d
- write_image(Disparity, … )
- write_image(X, … )
- write_image(Y, … )
- write_image(Z, … )
4.1 get_sheet_of_light_result
- 函数:get_sheet_of_light_result( : ResultValue : SheetOfLightModelID, ResultName : )
- 功能:获得用片光技术进行测量的标志性结果
- ResultName
- 规定应提供何种测量结果
- 值列表:’ disparity’,‘score’, ‘x’, ‘y’, ‘z’
4.1.1 未标定结果
-
“disparity”:
- 测量的视差图像。即,每个像素返回检测轮廓所在的亚像素行值。视差值可以看作是未经标定的伪距值。
-
“score”:
- 返回根据参数’score_type’的值计算的分数值。如果参数’score_type’被设置为’none’,那么在测量期间不会计算任何分数值,因此返回的图像是空的。有关模型参数“score_type”可能值的详细信息,请参阅create_sheet_of_light_model和set_sheet_of_light_param。
4.1.2 标定结果
- “x”:
- “y”:
- “z”:
- 当将ResultName设置为“x”、“y”或“z”时,返回图像的像素值与在系统标定期间隐式定义的世界坐标系统具有坐标语义。返回坐标的单位取决于参数’scale’的值。
5. 坐标系
- WCS:World coordinate system(世界坐标系: ( O w X w Y w Z w ) (O_wX_wY_wZ_w) (OwXwYwZw))
- CCS:Camera coordinate system(摄像机坐标系: ( O c X c Y c Z c ) (O_cX_cY_cZ_c) (OcXcYcZc))
- 以相机 sensor 中心为原点,单位mm
- Z轴与光轴重合
- IPCS:Image Plane coordinate system(图像物理坐标系: ( o x y ) (oxy) (oxy))
- 经过小孔成像后得到的二维坐标系
- 原点在中心
- 单位mm
- ICS(PCS):Image coordinate system(Pixel coordinate system:图像像素坐标系: ( o o u v ) (o_ouv) (oouv))
- 成像点在相机 sensor 上像素的行数和列数
- 原点为图像左上角
- 不带有任何物理单位,或者说单位是像素
5.1 坐标系之间的关系

5.1.1 摄像机坐标系 ( O c X c Y c Z c ) (O_cX_cY_cZ_c) (OcXcYcZc)与世界坐标系 ( O w X w Y w Z w ) (O_wX_wY_wZ_w) (OwXwYwZw)(刚体变换)
- 世界坐标系也叫物体坐标系,是根据实际需要而建立的坐标系。可以利用旋转矩阵R和平移矩阵T将摄像机坐标系转换为世界坐标系。
- R R R:机坐标系相对于世界坐标系的旋转矩阵
- T T T:机坐标系相对于世界坐标系的平移矩阵,即相机的中心在世界坐标系的坐标
[ X c Y c Z c 1 ] = [ R 3 × 3 T 3 × 1 0 T 1 ] [ X w Y w Z w 1 ] \begin{bmatrix} X_c \\ Y_c \\ Z_c \\ 1 \\ \end{bmatrix} = \begin{bmatrix} R_{3\times3} & T_{3\times1} \\ 0^T & 1 \\ \end{bmatrix} \begin{bmatrix} X_w \\ Y_w \\ Z_w \\ 1 \\ \end{bmatrix} XcYcZc1 =[R3×30TT3×11] XwYwZw1
- ( R , T ) (R, T) (R,T):为摄像机的位姿
5.1.2 摄像机坐标系 ( O c X c Y c Z c ) (O_cX_cY_cZ_c) (OcXcYcZc)与图像物理坐标系 ( o x y ) (oxy) (oxy) (相似三角形)

- 原理:
- 小孔成像
- 相似三角形
x X c = y Y c = f Z c \frac{x}{X_c}=\frac{y}{Y_c}=\frac{f}{Z_c} Xcx=Ycy=Zcf
- 首 先假定摄像机坐标系平行于图像物理坐标系, 摄像机光轴垂直于图像平面 ,并通过图像中心,设摄像机光轴方向为Z轴方 向,即 O c Z c O_cZ_c OcZc 为光轴 ,其中 O c O_c Oc为光心或投影中心 ,即 摄像机坐标系的原点 , o o o 为图像物理坐标系的原点 。 o o o为光轴上的一点,理论上可以认为它是图像中心。 并且 o x ox ox平行于 O c X c O_cX_c OcXc, o y oy oy平行于 O c Y c O_cY_c OcYc。由摄像机透视投影模型和摄像机几何模型可得:
Z c [ x y 1 ] = [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ X c Y c Z c 1 ] Z_c \begin{bmatrix} x \\ y \\ 1 \\ \end{bmatrix} = \begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0& 0 & 1 & 0 \\ \end{bmatrix} \begin{bmatrix} X_c \\ Y_c \\ Z_c \\ 1 \\ \end{bmatrix} Zc xy1 = f000f0001000 XcYcZc1
- ( X c , Y c , Z c , 1 ) T (X_c, Y_c, Z_c, 1)^T (Xc,Yc,Zc,1)T:空间某点在摄像机坐标系中的齐次坐标
- ( x , y , 1 ) T (x, y, 1)^T (x,y,1)T:在图像物理坐标系中的齐次坐标
- f f f:摄像机的焦距,即像平面到光心的距离
5.1.3 图像物理坐标系 ( o x y ) (oxy) (oxy)和图像像素坐标系 ( o o u v ) (o_ouv) (oouv) (离散化)

- 图像物理坐标系 ( o x y ) (oxy) (oxy)和图像像素坐标系 ( o o u v ) (o_ouv) (oouv)在同一个平面上,两个坐标系的坐标轴互相平行,但原点不同,单位也不同:
- 图像像素坐标系$(o_ouv):单位是像素,其原点位于图像平面的左上角
- 图像物理坐标系 ( o x y ) (oxy) (oxy):单位是米或毫米,其原点位于图像平面中心,也叫主点。
- 主点的像素坐标记为: ( u 0 , v 0 ) (u_0, v_0) (u0,v0)
- 像素的物理尺寸记为: ( d x , d y ) (d_x, d_y) (dx,dy),单位是毫米/每像素
- f x = f d x f_x = \frac{f}{d_x} fx=dxf
- f y = f d y f_y = \frac{f}{d_y} fy=dyf
[ u v 1 ] = [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ x y 1 ] \begin{bmatrix} u \\ v \\ 1 \\ \end{bmatrix} = \begin{bmatrix} \frac{1}{d_x} & 0 & u_0 \\ 0 & \frac{1}{d_y} & v_0 \\ 0& 0 & 1 \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \\ \end{bmatrix} uv1 = dx1000dy10u0v01 xy1
5.1.4 完整变换过程
Z c [ u v 1 ] = [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ f 0 0 0 0 f 0 0 0 0 1 0 ] ⋅ [ R 3 × 3 T 3 × 1 O 1 ] ⋅ [ X w Y w Z w 1 ] = M 1 M 2 [ X w Y w Z w 1 ] Z_c\begin{bmatrix} u \\ v \\ 1 \\ \end{bmatrix} = \begin{bmatrix} \frac{1}{d_x} & 0 & u_0 \\ 0 & \frac{1}{d_y} & v_0 \\ 0& 0 & 1 \\ \end{bmatrix} \begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \\ \end{bmatrix} \cdot \begin{bmatrix} R_{3 \times 3} & T_{3 \times 1} \\ O & 1 \\ \end{bmatrix} \cdot \begin{bmatrix} X_w \\ Y_w \\ Z_w \\ 1 \\ \end{bmatrix}=M_1M_2 \begin{bmatrix} X_w \\ Y_w \\ Z_w \\ 1 \\ \end{bmatrix} Zc uv1 = dx1000dy10u0v01 f000f0001000 ⋅[R3×3OT3×11]⋅ XwYwZw1 =M1M2 XwYwZw1
- M 1 M_1 M1:为相机内参,包括相机的焦距,光轴与图像平面的焦点位置等内部参数,和外部因素无关,因此称为内参,表示为:
M 1 = [ f x 0 u 0 0 f y v 0 0 0 1 ] M_1=\begin{bmatrix} f_x & 0 & u_0 \\ 0 & f_y & v_0 \\ 0& 0 & 1 \\ \end{bmatrix} M1= fx000fy0u0v01
- M 2 M_2 M2: 为相机外参,表征世界坐标系到相机坐标系的转换关系
- 是相机在世界坐标系下的位置姿态矩阵,认为是摄像机的外参
- 一般情况下,如果世界坐标系设置为相机坐标系,即二者重合,那么这个外参就是一个单位矩阵
M 2 = [ R 3 × 3 T 3 × 1 ] = [ r 1 r 2 r 3 t x r 4 r 5 r 6 t y r 7 r 8 r 9 t z ] M_2= \begin{bmatrix} R_{3 \times 3} & T_{3 \times 1} \\ \end{bmatrix} = \begin{bmatrix} r_1 & r_2 & r_3 & t_x \\ r_4 & r_5 & r_6 & t_y \\ r_7 & r_8 & r_9 & t_z \\ \end{bmatrix} M2=[R3×3T3×1]= r1r4r7r2r5r8r3r6r9txtytz

5.1.5 镜头畸变
5.1.5.1 径向畸变

- 沿着透镜的半径方向分布的畸变称为径向畸变。光线在远离透镜中心的地方比靠近中心的地方更加弯曲。径向畸变可以分为,桶形畸变和枕形畸变。如上图所示,从左到右分别是,正常无畸变、桶形畸变、枕形畸变。径向畸变是因为,远离透镜中心的光线比靠近透镜中心的光线更加弯曲。廉价的透镜更加严重,高端相机中并不是那么明显。光心的处的畸变为 0,距离越远畸变越大。
- 一般情况下,图像的径向畸变往往被描述为一个低阶多项式模型。(x, y) 是没有畸变的像素点的位置,$(x_d, y_d) $是径向畸变作用后的点的位置,则二者之间存在以下变换关系:
{ x d = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) y d = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) \begin{cases} x_d = x(1 +k_1r^2 + k_2 r^4 + k_3 r^6 ) \\ y_d = y(1 +k_1r^2 + k_2 r^4 + k_3 r^6 ) \end{cases} {xd=x(1+k1r2+k2r4+k3r6)yd=y(1+k1r2+k2r4+k3r6)
- k 1 , k 2 , k 3 k_1, k_2, k_3 k1,k2,k3:是径向畸变系数
- r 2 = x 2 + y 2 r^2 = x^2 + y^2 r2=x2+y2
5.1.5.2 切向畸变

- 切向畸变主要发生在相机 sensor 和镜头不平行的情况下,因为有夹角,所以光透过镜头传到图像传感器上时,成像位置发生了变化。具体原理如图1.6所示。切向畸变可以用下列公式表示:
{ x d = x + [ 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) ] y d = y + [ 2 p 2 x y + p 1 ( r 2 + 2 y 2 ) ] \begin{cases} x_d = x+[2p_1xy+p_2(r^2+2x^2)] \\ y_d = y+[2p_2xy+p_1(r^2+2y^2) ] \end{cases} {xd=x+[2p1xy+p2(r2+2x2)]yd=y+[2p2xy+p1(r2+2y2)]
- p 1 , p 2 p1, p2 p1,p2:是畸变系数,其他变量和径向畸变相同
- 将径向畸变和切向畸变放在一起考虑,可以得到下式:
{ x d = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + ( 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) ) y d = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + ( 2 p 2 x y + p 1 ( r 2 + 2 y 2 ) ) \begin{cases} x_d = x(1 +k_1r^2 + k_2 r^4 + k_3 r^6 ) +(2p_1xy+p_2(r^2+2x^2)) \\ y_d = y(1 +k_1r^2 + k_2 r^4 + k_3 r^6 ) + (2p_2xy+p_1(r^2+2y^2) ) \end{cases} {xd=x(1+k1r2+k2r4+k3r6)+(2p1xy+p2(r2+2x2))yd=y(1+k1r2+k2r4+k3r6)+(2p2xy+p1(r2+2y2))
5.2 激光三角标定模型及原理(重要)
-
由激光投射器投出的光平面与被测物体表面相交形成结构光条纹 。结 构 光条纹位 于光平面上,经透视投影在摄像机图像平面上成像 。 所以直接求解摄像机图像平面和光平 面之间的对应关系,是进行线 激光三维测量模型标定的有效方法 。

-
图示说明:
- ( O w x w y w z w ) (O_wx_wy_wz_w) (Owxwywzw):被测物坐标系
- ( O c x c y c z c ) (O_cx_cy_cz_c) (Ocxcyczc):摄像机坐标系
- ( O u x u y u ) (O_ux_uy_u) (Ouxuyu):图像像素坐标系
- z c z_c zc轴:垂直于图像像素平面
- x c x_c xc平行于 x u x_u xu, y c y_c yc平行于 y u y_u yu
- 被测物任意点 ( x w , y w , z w ) (x_w, y_w, z_w) (xw,yw,zw),在摄像机坐标系的对应点为 ( x c , y c , z c ) (x_c, y_c, z_c) (xc,yc,zc),在图像像素坐标系的对应点为 ( x u , y u ) (x_u, y_u) (xu,yu),同时此点还位于光平面内,即同时满足以下方程(1)和方程(2)
-
线激光三维测量的摄像机模型:
ρ [ x u y u 1 ] = A [ R c w T c w ] [ x w y w z w 1 ] = [ f x 0 u 0 0 f y v 0 0 0 1 ] [ r 1 r 2 r 3 t x r 4 r 5 r 6 t y r 7 r 8 r 9 t z ] [ x w y w z w 1 ] ( 1 ) \rho \begin{bmatrix} x_u \\ y_u \\ 1 \\ \end{bmatrix} = A \begin{bmatrix} R_c^w & T_c^w \\ \end{bmatrix} \begin{bmatrix} x_w \\ y_w \\ z_w \\ 1 \\ \end{bmatrix}= \begin{bmatrix} f_x & 0 & u_0 \\ 0 & f_y & v_0 \\ 0& 0 & 1 \\ \end{bmatrix} \begin{bmatrix} r_1 & r_2 & r_3 & t_x \\ r_4 & r_5 & r_6 & t_y \\ r_7 & r_8 & r_9 & t_z \\ \end{bmatrix} \begin{bmatrix} x_w \\ y_w \\ z_w \\ 1 \\ \end{bmatrix} \quad\quad (1) ρ xuyu1 =A[RcwTcw] xwywzw1 = fx000fy0u0v01 r1r4r7r2r5r8r3r6r9txtytz xwywzw1 (1)
-
光平面在世界坐标系中的方程:
a x w + b y w + c z w + d = 0 ( 2 ) ax_w +by_w + cz_w + d = 0 \quad \quad (2) axw+byw+czw+d=0(2)
-
参数说明:
-
A A A:摄像机内参数
-
[ R c w T c w ] [R_c^w \quad T_c^w] [RcwTcw]:摄像机外参,为世界坐标系到摄像机坐标系的变换矩阵
-
f x , f y f_x, f_y fx,fy:为x,y方向上的有效焦距(或归一化焦距, d x , d y d_x, d_y dx,dy为像素尺寸)
- f x = f d x f_x = \frac{f}{dx} fx=dxf
- f y = f d y f_y = \frac{f}{dy} fy=dyf
-
( u 0 , v 0 ) (u_0, v_0) (u0,v0):为主点坐标
-
ρ \rho ρ:为不等于0的比例因子
-
如果求得摄像机内参、外参和光平面方程,即可根据方程(1)和方程(2)求得图像像素坐标系中激光线上的点在世界坐标系中的三维坐标。
5.2.1 相机(内参和外参)标定原理
- 什么是相机标定?
- 在图像测量过程中,为确定空间物体表面某点的3D信息与其在图像中对应点之间的关系,必须建立摄像机成像的几何模型,这些几何模型的参数就是相机参数。在大多数条件下,这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为摄像机标定。

- 相机标定就是通过输入带有标定 pattern 的标定板来计算相机参数,用简单的数学模型来表达复杂的成像过程。
- 求解这个数学模型,也就是求解相机的参数,包括相机的内参,外参以及畸变参数。
- 有了这个数学模型,我们可以对相机拍摄的图片进行畸变校正,也可以用多个相机拍摄图片来进行三维重建,以及其他的计算机视觉的应用。
- 相机标定的过程分为两个部分:
- 第一步是从世界坐标系转为相机坐标系,这一步是三维点到三维点的转换,包括R,T(相机外参,确定了相机在某个三维空间中的位置和朝向)等参数;
- 第二部是从相机坐标系转为成图像像素坐标系,这一步是三维点到二维点的转换,包括K(相机内参,是对相机物理特性的近似)等参数;
- 投影矩阵 : P=K [ R | T ] 是一个3×4矩阵,混合了内参和外参而成。
- 在图像拼接或者三维重建中,就需要使用外参来求几幅图像之间的相对运动,从而将其注册到同一个坐标系下面来
- 相机标定就是表示从像素坐标系到世界坐标系的变换,而这主要是通过计算内参和外参得出的
- 在标定时,我们会拍摄很多张不同位姿的标定图片,但是我们的外参实际上只基于参考位姿下的图片,也就是说只基于一张标定图片(一般就是第一张图像)。由此可知,剩下的几次在不同位姿拍摄的标定图像主要是用来调整内参的,(而不是外参)
- 常用相机的标定方法
- 直接线性标定法
- Tsai的两步法相机标定
- Zhang的标定方法
- 使用消失点的相机标定
5.2.1.1 直接线性标定法(输入含三维信息)
- 直接线性标定法
- 通过8个已知点对 ( u , v ) → ( X , Y , Z ) (u,v) \rightarrow (X, Y, Z) (u,v)→(X,Y,Z)求解投影矩阵
- 未考虑畸变
- 不能分解得到内、外参
- 求12个参数

- 该方法需要一个标定点在世界坐标系中位置已知的立方体标定块,利用标定点在坐标系中的位置关系计算出摄像机的参数
5.2.1.2 Tsai的两步法相机标定
- 一种基于径向排列约束的标定方法
- Tsai的两步法相机标定
- 标定过程:
- 第一步:先考虑相机的径向畸变,利用超定方程计算出相机的外参(通过不少于7个已知点对),使用已知
的特定空间点和它们在图像中的二维坐标的测量数据,通过最小二乘法求解方程组,求得摄像机的旋转矩阵和平移向量
- 第二步:利用第一步的结果,对剩余的参数进行非线性优化,从而确定所有的相机参数。需要使用多个平行于图像平面的平面,并使用适当的标定板和采集图像,以获得准确的摄像机参数
5.2.1.3 张氏标定法(输入不含三维信息)
-
假定摄像机内部参数不发生变化,仅需摄像机对一个尺寸已知的平面模板从不同方向、不同位置拍摄两张以上的图像即可。这种方法的优点在于具有较高的灵活性和便利性,适用范围广泛。
-
张氏标定方法的基本步骤为:
- 制作一张平整光滑、图案清晰的棋盘图像标定板;
- 摄像机拍摄多幅不同位姿的标定板的图像,需保证每台相机都能同时拍到;
- 提取图像中的棋盘格特征点并确定内角点处的图像坐标与实际坐标;
- 假设为线性成像模型,求取内外参数;
- 求取畸变系数并对上一步中所得内外参数进行优化。
-
在传统标定法中,张正友标定法因为计算精度高和稳定性好而被广泛的使用。相较于传统标定方法和摄像机自标定法,张正友平面标定法标定模板易于制作,操作简单,且具有较高的标定精度和鲁棒性,广泛应用于工业领域。其实现的主要流程如图:

-
内参K

-
使用上式作为标定相机的五参数内参模型。通过建立每一个视角下,标定板上共面点的单应性矩阵,可以从每个视角的图片上获得八个约束,除去每个相机视角对应的 6 个自由度的相机外参数,还可以额外获得两个约束。所以,理论上,仅需要三幅不同视角的图片就可以完成标定。但实际上,考虑到标定的误差,以及镜头畸变的问题,往往一次成功的标定至少需要八张左右的图片。
-
Zhang 的方法是,通过多个视角的单应矩阵,先求解相机的内参,每个视角的外参,再加入镜头畸变模型,通过最小化重投影误差,在优化上述求得的相机内外参数的同时,对镜头畸变系数进行求解优化。其中由于涉及的标定板图片较多,而且往往标定板上的标定点数目也较多,此步非线性优化过程,一般速度较慢。具体所使用的镜头畸变模型,可以按需要增加其复杂度,本文实验过程中所用的镜头畸变模型均为忽略薄棱镜畸变的五参数镜头畸变模型。
5.2.1.4 OpenCV标定流程
5.2.2 光平面标定原理
-
激光光平面指的是由激光投射器原点及激光线所构成的平面,如下图所示:

-
依据公理:两条互相平行的直线可以确定且唯一确定一个平面,即:
p = l 1 × l 2 p = l_1 \times l_2 p=l1×l2
-
l 1 和 l 2 l_1和l_2 l1和l2:代 表光平面内两条互相平行的直线

-
l 1 和 l 2 l_1和l_2 l1和l2代表光平面内两条互相平行的直线 。 具 体操 作 如 下 : 首先采集投射在标定板上的激光条纹 l 1 l_1 l1,
,得到图像像素坐标系中的 l 1 ′ l_1^{'} l1′,然后利用辅助平板抬高标定板的位置,得到与激光条纹 l 1 l_1 l1平行的直 线 l 2 l_2 l2,其在图像像素平面上对应 l 2 ′ l_2^{'} l2′。已知 ( u i , v i ) (u_i, v_i) (ui,vi)是 l 1 ′ l_1^{'} l1′和 l 2 ′ l_2^{'} l2′的一点,根据方程(1)则可求出其在光平面上的3D坐标 ( x w i , y w i , z w i ) (x_{wi}, y_{wi}, z_{wi}) (xwi,ywi,zwi),将这些3D坐标代入方程(2),得如下方程组:
{ a x w 1 + b y w 1 + c z w 1 + d = 0 a x w 2 + b y w 2 + c z w 2 + d = 0 ⋮ a x w n + b y w n + c z w n + d = 0 ( 3 ) \begin{cases} ax_{w1} + by_{w1} + cz_{w1} + d = 0 \\ ax_{w2} + by_{w2} + cz_{w2} + d = 0 \\ \vdots \\ ax_{wn} + by_{wn} + cz_{wn} + d = 0 \\ \end{cases} \quad\quad (3) ⎩ ⎨ ⎧axw1+byw1+czw1+d=0axw2+byw2+czw2+d=0⋮axwn+bywn+czwn+d=0(3)
-
由于n远远大于4,方程(3)为超定方程,采用SVD算法(奇异值分解),即可求得参数 a , b , c , d a, b, c, d a,b,c,d,从而获得光平面方便。
5.2.2.1 标定过程
- 标定过程分为以下 3步:
- 1)采集参考坐标系和临时坐标系的外参数据
- 2)激光条图像处理
- 3)光平面拟合。
- 采集的标定数据包括两个不同高度上的图像,每个位置下分别采集一张只包含标定板和激光线打在标定板上的图像,如下图所示,对于所采集的激光线需要大致平行于水平方向,保证标定精度。


- 激光条三维坐标计算

- 根据所提取的激光线中心的像素坐标,结合相机内参和外参,通过反透视变换得到在各自标定板
所定义的 Z = 0 Z=0 Z=0平面上的激光线中心的三维坐标。
- 由于两组三维坐标都是定义在两个不同位置的标定板所定义的世界坐标系下,还需要通过下式建立相
机坐标系和两个标定板世界坐标系之间的转化关系。
w c s 1 H w c s 2 = w c s 1 H c a m × c a m H w c s 2 ^{wcs1}H_{wcs2} =^{wcs1}H_{cam} \times ^{cam}H_{wcs2} wcs1Hwcs2=wcs1Hcam×camHwcs2
- w c s 1 H w c s 2 ^{wcs1}H_{wcs2} wcs1Hwcs2 :是两个世界坐标系之间的坐标变换
- w c s 1 H c a m 和 c a m H w c s 2 ^{wcs1}H_{cam} 和 ^{cam}H_{wcs2} wcs1Hcam和camHwcs2:是两个标定板坐标系与相机坐标系之间的坐标变换
- 至此,两组三维坐标统一到了同一个坐标系下。最后利用三维坐标数据进行光平面的拟合
5.2.3 激光扫描运动(移动位姿)标定原理
-
激光三角法采用扫描的形式将每一个位置下所拍摄到的图片中的激光线像素坐标转化成三维坐标,同时需要将相邻的两次拍摄的数据坐标进行拼接。

-
如上图所示的是在相机连续两次拍摄时,视觉系统分别移动到的位置 p o s 1 pos_1 pos1和 p o s 2 pos_2 pos2 ,图中 w c s 1 wcs_1 wcs1 和 w c s 2 wcs_2 wcs2分别表示在相机外参标定后两个位置下的参考坐标系,因为视觉系统在移动,所以每一个位置下都对应有一个参考坐标系,且它与相机坐标系之间的变换等于相机的外参。
-
根据激光光平面的标定参数以及相机内外参可以计算出在相对于自身参考坐标系下的激光三维坐标,故需要知道两个位置下的世界坐标系 w c s 1 wcs_1 wcs1和 w c s 2 wcs_2 wcs2之间的变换关系 H H H,才能将三维坐标统一转化到一个局部坐标系下,从而需要对在相机连续采集两张激光线图像时间内,计算出参考坐标系之间的变换,即移动位姿的标定。

-
将标定板放在一维电控运动平台上,采集其任意两张连续图像 ,通过摄像机标定可知标定板在摄像机坐标系中的位姿 [ R C 1 , T C 1 ] [R_{C1}, T_{C1}] [RC1,TC1]和 [ R C 2 , T C 2 ] [R_{C2}, T_{C2}] [RC2,TC2],已知摄像机坐标系相对于世界坐标的关系为 [ R W C , T W C ] [R_W^C, T_W^C] [RWC,TWC],则有:
[ R W 1 , T W 1 ] = [ R C 1 , T C 1 ] [ R W C , T W C ] [ R W 2 , T W 2 ] = [ R C 2 , T C 2 ] [ R W C , T W C ] [R_{W1}, T_{W1}] = [R_{C1}, T_{C1}] [R_W^C, T_W^C] \\ [R_{W2}, T_{W2}] = [R_{C2}, T_{C2}] [R_W^C, T_W^C] [RW1,TW1]=[RC1,TC1][RWC,TWC][RW2,TW2]=[RC2,TC2][RWC,TWC]
-
其中 R W 1 , T W 1 R_{W1}, T_{W1} RW1,TW1和 [ R W 2 , T W 2 ] [R_{W2}, T_{W2}] [RW2,TW2]分别为标定板在世界坐标系中的位姿,因为扫描为一维平移运动,则得扫描述运动:
v = T W 2 − T W 1 v = T_{W2} - T_{W1} v=TW2−TW1
5.2.3.1 激光扫描运动(移动位姿)标定过程

- 移动位姿的标定的具体步骤:
- 将标定板放置于工作平面上,让直线模组搭载视觉系统运动到第一个位置,采集一张包含标定板的图像
- 同样视觉系统运动到第二个位置,再采集一张图像,如上图 所示
- 通过上文中的相机外参标定分别获取两个位置下的坐标变换关系。移动位姿的标定需要保证两个运动位置之间的距离足够大,在本文中采集两张标定板之间的运动距离使用直线模组控制在 200mm。
- 采集速度以 30 帧图像每秒的情况下,计算两个位置运动时间,得到在这段时间内相机的采集图像的总数,从而得到连续采集两幅图像的时间内的移动位姿如下表所示:

5.2.4 布局参数计算

- 除了视觉系统的硬件参数配置外,相机与激光器之间的布局参数也会影响到视觉系统的基本参数指标,布局参数包括:
- 激光器与相机之间夹角的选取涉及到深度重建误差,一般在经验上取: 30 度到60 度之间,已经由光平面标定所确定。
- 基线距离的选取需要保证了在工作距离范围内,激光线始终在相机的视野范围内,该参数需要结合光平面位姿、参考
坐标系以及工作距离加以计算。
5.3 点在两个不同坐标系中的坐标

5.4 3D世界坐标点转换为像素坐标
p w → p c → q c → q ^ c [ → q t ] → q i p^w \rightarrow p^c \rightarrow q^c \rightarrow \hat q^c [\rightarrow q^t] \rightarrow q^i pw→pc→qc→q^c[→qt]→qi
- p w = ( x w , y w , z w ) T p^w = (x^w, y^w, z^w)^T pw=(xw,yw,zw)T:世界坐标系中的点(单位:m)
- p c = ( x c , y c , z c ) T p^c=(x^c, y^c, z^c)^T pc=(xc,yc,zc)T:摄像机坐标系中的点(单位:m)
- q c q^c qc:投影到图像平面的坐标(单位:m)
- q ^ c \hat q^c q^c:畸变之后的点(单位:m)
- q t q^t qt:倾斜图像平面上的点(单位:m)
- q i = ( r , c ) T q^i = (r,c)^T qi=(r,c)T:点的像素坐标
5.5 针孔相机的透视投影
- 相机坐标系原点:光心

- 虚拟图像平面

5.6 相机外参(R, T)
- 相机外参: R ( α , β , γ ) , T ( t x , t y , t z ) R(\alpha, \beta, \gamma), T(t_x, t_y, t_z) R(α,β,γ),T(tx,ty,tz)
- 把世界坐标系变换为相机坐标系
- p w = ( x w , y w , z w ) T p^w = (x^w, y^w, z^w)^T pw=(xw,yw,zw)T
- p c = ( x c , y c , z c ) T p^c=(x^c, y^c, z^c)^T pc=(xc,yc,zc)T
p c = H c a m _ p o s e ⋅ p w p^c = H_{cam\_pose} \cdot p^w pc=Hcam_pose⋅pw
5.7 投影
- 把相机坐标系(CCS)中的3D点投影到图像平面坐标系(IPCS),投影是透视变换:
q c = ( u v ) = f z c ( x c y c ) q^c = \begin{pmatrix} u\\ v\\ \end{pmatrix} = \frac{f}{z^c} \begin{pmatrix} x^c\\ y^c\\ \end{pmatrix} qc=(uv)=zcf(xcyc)
5.8 变换为像素坐标
- 从IPCS变换为像素坐标系(ICS/PCS)
- q ^ c = ( u ^ , v ^ ) T \hat q^c=(\hat u, \hat v)^T q^c=(u^,v^)T
q i = ( r c ) = ( v ^ S y + C y u ^ S x + C x ) q^i = \begin{pmatrix} r\\ c\\ \end{pmatrix} = \begin{pmatrix} \frac{\hat v}{S_y} + C_y \\ \\ \frac{\hat u}{S_x} + C_x \\ \end{pmatrix} qi=(rc)= Syv^+CySxu^+Cx
- 参数说明:
- S x S_x Sx:Sensor Pixel的宽
- S y S_y Sy:Sensor Pixel的高
- ( C x , C y ) T (C_x, C_y)^T (Cx,Cy)T:光心在IPCS中的投影坐标
6. Halcon标定
- 参考1
- 在做测量的时候相机和拍摄平面可以不是完全垂直,或者物料可以任意方向倾斜
- Halcon的标定方法还可以实现相机标定和确定工作平面位姿进行分离,这意味着你标定完相机后,你的测量平面可以随时改换
6.1 Halcon标定板
-
高精度的相机标定过程中,大多是以比较明确的特征点来作为参考,所以通过识别标定板的圆形,拟合出精确的中心位置,然后再通过已知的标定板参数来消除投影造成的偏心误差
-
对于标定板大小的选取,六角形排列的标定板应该覆盖整个图像,对于矩形排列的标定板,至少覆盖整个图像的1/4
-
标定实现的原理:
- 是根据相机的像元尺寸、焦距和标定板的描述文件(.descr)来找到显示的标定板图像上面的标志点
- 从而确定标定板实际输入的参数(Distance、Diameter等)和这些参数对应的图像像素大小的关系,完成标定
-
标定板坐标系位于所有标记的重心,其z轴指向标定板,其x轴向右,其y轴向下
-
六角排列的标定板(蜂窝标定板)

-
矩形排列的标定板(矩阵标定板)

6.2 标定过程注意事项
- 标定过程中切勿更改相机设置:位置、光圈、焦距
- 标定板的放置:
- 标定板的每个部分均应至少被图像覆盖一次,标定板也可以填充整个图像
- 倾斜角度, 校准图像集还应包含带有倾斜标定板的图像。大约30-45°的角度沿不同方向倾斜,如果景深而无法实现推荐的角度,则应至少在设置时使板倾斜得尽可能陡
- 图像数量/校准板姿势,六边形的最少6张,至少4张带有倾斜,三角形最少15张
- 不允许倒置
- 标记直径应至少为20个像素,建议40个像素左右,即一个黑点的直径为40
- 校准板的明暗区域之间的对比度应至少为100灰度值,亮区域不要设置为255,不要过曝(不要超过240)
- 避免过曝,浅色部分的灰度值不超过240
- 校准板应均匀照明,并应避免反射,相同颜色区域灰度值范围不应超过45
- 对于六角形排列的标定板,至少使用6张图像,矩形排列的标定板10到15张
- 对于矩形排列的标定板,用一个背景比标定板更暗的光照
- 圆的直径应该至少20个像素
6.3 两种标定模型对比
- 标定模型
- 分割模型(Division)
- 分割模型使用一个参数(k)对径向变形进行建模,光学中心就在图像中心
- [‘area_scan_division’,Focus,Kappa,Sx,Sy*,Cx,Cy,ImageWidth,ImageHeight]
- 多项式模型(polynomial)
- 光学中心可能不在图像中心
- 多项式模型使用三个参数(K1,K2,K3)对径向变形进行建模,并使用两个参数(P1,P2)对离心变形进行建模
- [‘area_scan_polynomial’,Focus,K1 ,K2,K3,P1,P2,Sx,Sy*,Cx,Cy,ImageWidth,ImageHeight]
- 分割模型使用一个参数K来建模径向变形,而多项式模型使用五个参数来建模径向变形(K1, K2, K3)和离心变形(P1, P2)
- 校准图像少,或者没有充分覆盖视野, 则分割模型通常会比多项式模型产生更稳定的结果
- 多项式模型的主要优点是它可以更精确地对变形进行建模,并且还对偏心变形进行了建模,缺点是计算慢
- 通常,应使用分割模型进行校准。如果校准的准确性不够高,则可以使用多项式模型
6.4 标定细节
- 提取HALCON标定板上的标志点
- 算子find_calib_object寻找标定板,决定了标定标志点的图像坐标,并具有很高的精度,最后将结果存储在标定数据模型中。
- 需要注意的是find_caltab和find_marks_and_pose仅仅被用于矩形排列的标定板。还有,它们需要复杂的参数调整。相反的是,可以用于所有标准的HALCON标定板,自动选择合适的参数,因此更容易去使用。
- 限制标定到特定的参数
- 如果某相机参数已知了,你可以用算子set_calib_data从标定中排除它们,类似的,你可以限制标定到某些参数。
- 执行标定
- 在准备了标定数据模型以后,可以通过调用calibrate_cameras来执行标定,用标定数据模型作为输入
- 作为一个直接结果是,仅仅是标定错误被返回。你可以用算子get_calib_data来更进一步的去分析标定结果的质量。
- 主要的标定结果,例如相机的内参,被存储在标定数据模型中。
- 访问标定结果
- 算子calibrate_cameras的主要结果由相机内参和每一张图像标定板的位姿组成。算子将它们存储在标定数据模型中,可以用算子get_calib_data来访问它们。
- get_calib_data(CalibHandle, ‘camera’, 0, ‘params’, DataValue)
- 相机外参并不能直接被获取,因为所需的世界坐标系统的信息没有存储在标定数据模型中。然而,如果标定板被直接放置在测量平面上,其位姿可以被用来很容易的得到相机的外参,其是测量平面的位姿。
- 确定相机外参
- 相机外参描述了测量平面和相机的关系,例如如果仅仅外参是已知,就可能将相机坐标系统(CCS)转化到测量平面的坐标系统,反之亦然。在HALCON中,测量平面被定义为世界坐标系统(WCS)z=0的平面。
- 相机外参可以用不同的方法来确定:
- 利用从某一个标定图像获取的位姿,其中标定图像中标定板被直接放置在测量平面上。在这种情况下,你就可以用算子get_calib_data来获得其位姿。
- 通过一个标定板被直接放置在测量平面的额外图像,将相机内参的确定从相机外参的确定分离出来。应用find_calib_object去提取标定标志点和位姿。
- 自己去确定3D世界点和它们在图像映射的对应关系,然后调用vector_to_pose
- 如果你仅仅需要去精确地测量一个物体的尺寸,而不是在一个给定坐标系统的物体的绝对位置,前两种方法中一种就可以使用。
- 后两种情况具有相机外参的决定不依赖相机内参的优势。如果用单个相机在数个平面上做测量,或者不能在原地标定相机,这将是更加灵活和有用。
6.4.1 在标定图像之一将标定板放置在测量平面上(相机位姿)
- 标定板必须直接放置在测量平面上,例如流水线。
- 因为通过算子calibrate_cameras,标定板的位姿可以确定下来,你可以通过算子get_calib_data简单的访问其位姿。这样,用一个单一的标定步骤,内参和外参就能确定下来。这里,在第一个标定图像中标定板(标定物索引0)的位姿被确定。请注意的是每一个位姿是由7个值组成的。
get_calib_data(CalibHandle, 'calib_obj_pose', [0,1], 'pose', DataValue1)
- 如果标定把是无限的薄的,结果位姿将是测量平面的真实位姿。因为真实的标定板有一个厚度d>0,标定板的位姿通过一个垂直于测量平面的量d的移动,例如沿着WCS的z轴。为了矫正它,我们需要沿着WCS的z轴去移动位姿d个单位。为了执行这个移动,使用算子set_origin_pose:
set_origin_pose (CameraPose, 0, 0, 0.003, CameraPose)
6.4.2 在一个单独图像中放置标定板在测量平面上(相机位姿)
- 如果用HALCON标定板的优势可以将相机内参和外参分离所具有的灵活性相结合,第二种相机外参确定的方法可以使用。
- 首先,相机按照标定步骤进行标定。这可以优先于相机在最终使用点安装之前完成。
- 然后,在最终使用点安装完相机以后,外参就可以被确定。仅仅需要做的就是取一张图,图中标定板被直接放在了测量平面上。从这张图中,外参就可以被确定下来。这里,内参,标定板被直接放在测量平面上的图像和标定标志点的世界坐标可从文件中读取。
read_cam_par('camera_parameters.data',CamParam)
read_image(Image,ImgPath+'calib_11')
find_calib_object(Image,CalibDataID,0,0,1,[],[])
- 最后,考虑到标定板的厚度,被给相机位姿原点的值平移标定板厚度个单位。
set_origin_pose(PoseForCalibrationPlate,0,0,0.00075,PoseForCalibrationPlate)
- 需要注意的是,如果想将标定步骤分为两个部分来完成的话,相机的聚焦是很重要的,因为改变焦点就相当于改变焦距,其是内参的一部分。
6.4.3 利用已知的3D点和它们对应的图像点
X:=[0,50,100,80]
Y:=[5,0,5,0]
Z:=[0,0,0,0]
- 然后,在图像上这些点映射后的图像坐标被确定。在这个例子中,它们被很简单的设定位一些接近的值。实际上,它们应该以亚像素的精度确定下来,因为他们定义了相机外参。
RCoord:=[414.02, 227.32, 85.98, 128.23]
CCoord:=[119.21, 318.45, 550.02, 448.82]
- 最后,算子vector_to_pose在已知对应关系和相机内参的情况下,被调用。
vector_to_pose(X,Y,Z,RCoord,CCoord,CamParam,'iterative','error',FinalPose,Errors)
- 保存结果和销毁标定数据模型
- 在访问结果(或者用算子write_cam_par和write_pose来存储它们),你可以借助算子clear_calib_data销毁标定数据模型。
6.5 标定后改变世界坐标系参考点方法
- Halcon相机标定完成后,世界坐标系原点在标定板的中间,如果要自定义坐标系原点的方案如下:

6.5.1 仿射变换
pose_to_hom_mat3d (FinalPose, HomMat3D)
hom_mat3d_translate_local (HomMat3D, dx, dy, 0, HomMat3DTranslate)
hom_mat3d_rotate_local (HomMat3DTranslate, rad(da), ‘z’, HomMat3DAdapted)
hom_mat3d_to_pose (HomMat3DAdapted, PoseAdapted)
6.5.2 设置位置与角度
tuple_replace (FinalPose, 5, PoseCalib[5]+da, NewPose)
set_origin_pose (NewPose, dx, dy, 0, PoseAdapted)