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

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

第四步:建立射线求出λ

第六步:求三维坐标

相关推荐
imuliuliang19 小时前
关于数据结构在算法设计中的核心作用解析7
算法
2401_8949155320 小时前
GEO 搜索优化完整源码从零部署:环境配置、集群搭建全流程
开发语言·python·tcp/ip·算法·unity
普通网友1 天前
共识算法实现:从工作量证明到权益证明的演进
算法·区块链·共识算法
ldmd2841 天前
地图生成算法(噪声篇-Perlin,Simplex,Value noise)
算法·go·地图生成
国科安芯1 天前
FreeRTOS RISC-V 浮点上下文切换移植:在 IAR 工程中完整保存 FPU 寄存器
java·开发语言·单片机·嵌入式硬件·算法·系统架构·risc-v
小陈phd1 天前
集成检索介绍
算法
小poop1 天前
轮转数组:从暴力到最优,一题掌握算法复杂度分析
数据结构·算法·leetcode
樱桃读报僵尸1 天前
说说 LLMRouter,Agent 执行过程中怎么动态的选择 LLM
算法
gis开发之家1 天前
《Vue3 从入门到大神40篇》Vue3 源码详解(十):diff 算法全解析 —— 为什么 Vue3 比 Vue2 更快?
javascript·算法·typescript·前端框架·vue3·vue3源码