C# 视觉量检测系列(六):3D 视觉量检测入门 —— 深度相机与点云测量

📅 2026/8/17 21:05:23
C# 视觉量检测系列(六):3D 视觉量检测入门 —— 深度相机与点云测量
系列:C# 视觉量检测工程师成长路线图本篇定位:从 2D 平面跃升到 3D 空间,打开视觉量检测的新维度目标读者:已掌握 2D 视觉检测、想拓展 3D 测量能力的 C# 开发者前置知识:相机标定、点云基础、C# 编程阅读时间:约 18 分钟一、为什么需要 3D 视觉?2D 视觉在平面检测场景中表现出色,但面对以下需求时无能为力:高度/平面度测量:2D 只能看到投影,无法获取 Z 方向信息体积测量:如锂电池电芯的膨胀检测曲面缺陷检测:如汽车覆盖件的凹坑、凸起透明/反光物体:2D 成像困难,3D 不受表面纹理影响无序抓取:需要从点云中识别目标位姿3D 视觉量检测的核心优势:直接获取 (X, Y, Z) 三维坐标,测量结果不受物体表面颜色、纹理、光照变化的影响。二、3D 深度相机技术原理三种主流 3D 深度相机技术:双目立体视觉(Stereo)(三角测量)、结构光(Structured Light)(投影编码方案)、飞行时间(ToF)。2.1 三种技术对比技术原理精度帧率抗光干扰适用场景双目立体视觉三角测量,模拟人眼中等高差室外、大场景结构光投射编码光图案,解相位高(±0.01~0.1mm)中中等工业检测、面部识别ToF测量光脉冲往返时间中(±1~10mm)高好手势识别、避障工业量检测首选结构光:精度高、稳定性好、技术成熟。2.2 结构光深度相机的工作原理结构光系统由投影仪和相机组成:投影仪向物体投射编码的光图案(如条纹、格雷码、正弦相移)光图案在物体表面发生变形相机拍摄变形后的图案通过解码变形量,计算每个像素对应的深度值深度计算公式(简化):Z = B ⋅ f d Z = \frac{B \cdot f}{d}Z=dB⋅f​其中:B BB= 基线距离(投影仪与相机的间距)f ff= 相机焦距d dd= 视差(同一特征点在左右图像中的位置差)三、点云基础:3D 视觉的数据载体3.1 什么是点云?点云(Point Cloud)是 3D 空间中大量点的集合,每个点包含( X , Y , Z ) (X, Y, Z)(X,Y,Z)坐标,可能还包含颜色( R , G , B ) (R, G, B)(R,G,B)或法向量( N x , N y , N z ) (N_x, N_y, N_z)(Nx​,Ny​,Nz​)。点云 = { P₁, P₂, P₃, ..., Pₙ } 其中 Pᵢ = (Xᵢ, Yᵢ, Zᵢ, [Rᵢ, Gᵢ, Bᵢ], [Nₓ, Nᵧ, Nᵤ])3.2 点云在 C# 中的表示点云是 3D 空间中大量点的集合,每个点包含 (X, Y, Z) 坐标。/// summary/// 3D 点/// /summarypublicstructPoint3D{publicfloatX,Y,Z;publicbyteR,G,B;// 可选:颜色publicfloatNx,Ny,Nz;// 可选:法向量}/// summary/// 点云数据容器/// /summarypublicclassPointCloud{publicListPoint3DPoints{get;set;}=newListPoint3D();publicintWidth{get;set;}// 有序点云的宽度(如 1920)publicintHeight{get;set;}// 有序点云的高度(如 1080)publicboolIsOrganized=Width0Height0;/// summary/// 从深度图生成点云(使用相机内参)/// /summarypublicstaticPointCloudFromDepthMap(ushort[]depthMap,intwidth,intheight,floatfx,floatfy,floatcx,floatcy,floatscale=0.001f){varpc=newPointCloud{Width=width,Height=height};for(intv=0;vheight;v++){for(intu=0;uwidth;u++){intidx=v*width+u