激光三角 光平面标定之后计算深度图

到 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已经标定出光平面

第四步:建立射线求出λ

第六步:求三维坐标

相关推荐
longlongzihan8 小时前
LeetCode 17电话号码的字母组合:回溯算法(DFS)详解
c++·算法·leetcode·深度优先
封印师请假去地球钓鱼8 小时前
边解边变的问题:从“决策依赖“一词出发
人工智能·算法
今晚打老虎9 小时前
c++之提高A(前缀和)(第三课)
数据结构·c++·算法
不会就选b10 小时前
算法日常・每日刷题--<贪心>26
数据结构·算法
hetao173383711 小时前
2026-09-29 hetao1733837 的刷题记录
c++·算法
欣欣之王来了12 小时前
AI合规专项:AI算法透明度的合规要求
人工智能·算法
wzdark12 小时前
分块思想在算法优化中的实践与应用4
算法
Because_of_Her112 小时前
dfs-洪水填充技巧
笔记·算法·深度优先·洪水填充
小静AI工程实验室13 小时前
RSA 算法详解:从模幂原理到 OAEP 加密、PSS 签名与 Python 实验
python·算法
xzal1213 小时前
GESP Python笔记
笔记·python·算法