到 LightPlanePose 求出来以后,整个标定已经结束了。
后面的 apply_sheet_of_light_calibration() 干的事情,本质上就是一句话:
对图像中的每一个激光亚像素点,求"相机射线"与"激光平面"的交点。交点的三维坐标就是深度。

其中
Camera
│
│
│ 射线(ray)
│
▼
交点(X,Y,Z)
而
激光平面
已经知道:
Ax+By+Cz+D=0
所以
深度 = 射线和平面的交点。

一、射线理解

这个问题其实是整个单目视觉几何的起点。
只要你把射线方程推出来,那么后面的
像素 → 射线 → 光平面 → 三维点
整个 HALCON 光平面标定流程就全部连起来了。
针孔相机模型

为什么一个像素不是一个三维点?
例如图像中 (u,v)
实际上只能说明
光线经过了这个像素。
不能说明距离。
一个像素对应的是一整条光线。
不是一个点。
把像素变成相机坐标

方向向量

为什么HALCON写成
二维 已知 起点 (x0,y0)
方向 (a,b)
直线
x=x0+λa
y=y0+λb
三维只是多一个坐标


HALCON里面这个 r 怎么求?
像素(u,v)
↓
去畸变
↓
乘
得到
如果光平面是在世界坐标下,
还需要
二、深度计算
1、图像输入

2 提取激光中心(Steger)
HALCON内部第一件事就是:
lines_gauss()
或者
compute_3d_coordinates_of_light_line()
里面调用Steger。于是得到
cpp
(u,v)
(210.34 , 101.26)
(211.30 ,101.28)
(212.27 ,101.31)
......
全部都是亚像素
3 每个像素反投影成射线
利用相机内参 K 然后对每个点 P=
反投影出 ->
实际上
cpp
一个像素
↓
一条射线

射线

而且上面我们已经 LightPlanePose

带入

解 λ

4、代回射线
反解出三维点

这个就是单个点的位置和深度
三、案例计算
计算流程
像素(u,v)
│
▼
去畸变
│
▼
K⁻¹
│
▼
得到射线方向 r
│
▼
LightPlanePose
│
▼
射线和平面求交
│
▼
三维点(X,Y,Z)
已知条件

第一步:图像中检测到一个激光中心
Steger算法得到 (u,v)=(760,520)
第二步:去内参得射线方向

第三步:HALCON已经标定出光平面

第四步:建立射线求出λ

第六步:求三维坐标


