结构光深度计算原理介绍

本文介绍了结构光深度相机的工作原理,通过投影仪投射格雷码或多频相位图,结合相机接收的图像,利用三角测距法计算深度,同时提到了双目标定和混合使用多种方法以提高精度和计算速度。

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

目录

结构光与tof区别

 结构光格雷码计算原理

结构光多频外差计算原理

相位计算函数

相位解包裹

保存相位图


结构光与tof区别

结构光与tof都是可以直接生成深度图的深度相机,与tof不同,结构光是利用三角测距法配合投影仪计算深度图,其精度相比tof要更高一些能达到1mm内。结构光光学原理比tof要复杂一些,下面根据个人理解介绍一下结构光深度计算原理。

 结构光格雷码计算原理

结构光组成主要分为投影仪和ir相机,投影仪可以投影格雷码或多频正弦相位图。格雷码和多频相位图主要用于唯一确定图像位置,格雷码由多张不同编码等级的二进制表示黑白格子图组成,不同等级的格雷码图可以通过将二进制0 1数字反复作对称与扩展而得到。等级越高,编码越复杂,可以唯一标记的像素宽度就越大,可以根据分辨率确定需要用到的格雷码图片个数。比如用五张格雷码图依次用投影仪投影到物体表面,相机接收物体反射回的图像,从图像表面的黑白灰度等级就可以解析出对应的格雷码位置。把整张图解析后就得到了所有的图像像素对应的格雷码对应投影仪表面的位置,物体表面深度变化不同,经过投影后的格雷码在相机像素坐标系的坐标也不同,因此可以反应深度变化。相机和投影仪的对应点位置关系确定后,如果把相机和投影仪看作双目,可以提前进行双目标定极线矫正。之后利用左右相机的对应像素根据基线尺寸利用三角测距即可计算对应深度值。

结构光多频外差计算原理

如果投影仪加载的是两张不同频率的正弦相位条纹图,相机接收的图像是灰度随正弦相位变化的图像,频率不同其灰度变化也不同,通过计算某一点的像素的灰度值可以计算其对应的正弦相位值,通过相位差法也可以计算两个频率唯一确定的相位点从而唯一确定相机图像与投影仪图像的对应位置关系,同理经过双目相机标定和三角测距方法可以计算整个图像的深度值。

        综上就是结构光的计算深度基本原理,实际使用中可能会用到两个相机一个投影仪。并同时使用格雷码法和多频外差法,提高计算深度的精度,另外会用gpu cpu加速的方法提高算法计算速度。

结构光计算matlab代码


clear; clc;
close all;

%% 超参数
width  = 1280;        % 投影仪分辨率:高
heigth = 720;         % 投影仪分辨率:宽
Ts     = [70 64 59];  % freq = 1 / T,
A      = 128;         % 调制强度
B      = 127;         % 调制幅值
N      = 12;          % 相移步数 
save_dir = "output/";


%% step1. 条纹生成
Is = cell(3, N);  
for i = 1: 3
    for k = 1: N
        Is{i, k} = zeros(heigth, width);
    end
end

for i = 1: 3     % 对应三种不同的频率
    for k = 1: N % 对应N步相位
        for x = 1: width 
            %Is{i, k}(:, x) = (A + B * cos(2 * pi  *  x / Ts(i) + (k - 1) * (2 * pi / N))) / 255.;
            Is{i, k}(:, x) = (A + B * cos(2 * pi * Ts(i) *  x /  width + (k - 1) * (2 * pi / N))) / 255.;
        end
        m_save_phase_map(Is{i, k}, save_dir + "img" + int2str(k) + ".bmp");
    end
end
 


%% step2. 包裹相位
pha = cell(3, 1);

for i = 1: 3
    pha{i, 1} = m_calc_wrapped_phase(Is, N, i);
end

%% step3. 相位展开
pha1 = pha{1, 1};
pha2 = pha{2, 1};
pha3 = pha{3, 1};
pha12 = m_calc_absolute_phase(pha1, pha2);
pha23 = m_calc_absolute_phase(pha2, pha3);
pha123 = m_calc_absolute_phase(pha12, pha23);


%% step4. 查看结果
m_save_phase_map(pha1, save_dir + '1相位主值.bmp');
m_save_phase_map(pha2, save_dir + '2相位主值.bmp');
m_save_phase_map(pha3, save_dir + '3相位主值.bmp');
m_save_phase_map(pha12, save_dir + '1,2外差.bmp');
m_save_phase_map(pha23, save_dir + '2,3外差.bmp');
m_save_phase_map(pha123, save_dir + '1,2,3外差.bmp');

figure; plot(pha123(1, :)); title("某行相位.bmp");

相位计算函数

function pha12 = m_calc_absolute_phase(pha1, pha2)
mask1 = pha1 > pha2;
pha12 = (pha1 - pha2) .* mask1 + (2 * pi - (pha2 - pha1)) .* (1 - mask1);
end

相位解包裹

function pha = m_calc_wrapped_phase(Is, N, idx)
sin_sum = 0.;
cos_sum = 0.;

for k = 1: N
    Ik = Is{idx, k};
    sin_sum = sin_sum + Ik * sin(2 * (k - 1) * pi / N);
    cos_sum = cos_sum + Ik * cos(2 * (k - 1) * pi / N);
end
pha = -atan2(sin_sum, cos_sum);
end

保存相位图

function [] = m_save_phase_map(pha, name)
figure(), mesh(mat2gray(pha)); title(name); xlabel('X'); ylabel('Y'); zlabel('Pha'); imwrite(mat2gray(pha), name); 
end

### 结构光深度相机的工作原理 结构光深度相机是一种基于主动投影的三维传感技术,其核心在于向目标场景投射已知的空间编码图案(通常是红外光),并利用摄像头捕捉经物体表面调制后的变形图案。通过对原始图案与实际捕获图案之间的差异分析,可以重建出物体的三维几何形状。 具体而言,结构光系统的运作过程如下: 1. **光源发射阶段** 使用特定的光学元件(如数字微镜阵列或激光散斑发生器)将预先设计好的结构化光图案投射到被测物体表面上[^3]。这种图案通常由一系列条纹、点阵或其他复杂图形组成,能够提供丰富的空间信息。 2. **图像采集阶段** 经过物体表面反射后,原本规则的结构光图案会发生形变。安装在一定基线距离上的摄像机负责拍摄这一经过调制的图像序列。 3. **数据处理阶段** 利用计算机视觉算法对比发送端的标准模板与接收端的实际观测结果之间存在的偏差情况,进而推导出对应位置处的高度差值或者坐标偏移量关系式。最终形成完整的三维模型表示形式——即所谓的“深度图”。 #### IT 领域中的典型应用 - **消费电子领域** 在智能手机面部解锁功能方面得到了广泛应用;例如苹果公司的Face ID系统就是采用了类似的方案来获取用户的精确脸部轮廓特征用于身份验证目的。 - **增强现实(AR)/虚拟现实(VR)** 提供更加逼真的交互体验效果,在游戏娱乐以及远程协作等方面发挥重要作用。 - **机器人导航避障** 帮助自主移动平台感知周围环境障碍物分布状况以便做出合理路径规划决策。 ```python import numpy as np from scipy.optimize import least_squares def calculate_depth(structured_light_pattern, observed_image): """ 计算深度信息函数示例 参数: structured_light_pattern (np.ndarray): 发射的结构光图案 observed_image (np.ndarray): 实际观察到的画面 返回: depth_map (np.ndarray): 得到的深度地图 """ # 这里仅作为示意代码,未包含具体的数学建模细节 residuals = lambda x: ... # 定义残差方程组表达式 initial_guess = [...] # 设置初始猜测参数列表 result = least_squares(residuals, initial_guess) return result.x.reshape(observed_image.shape) if __name__ == "__main__": pattern = generate_structured_light() # 获取标准结构光图案 captured_img = capture_scene_with_camera() # 拍摄当前场景画面 depth_info = calculate_depth(pattern, captured_img) # 处理得到深度信息 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三十度角阳光的问候

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值