数据集计算机视觉3D视觉【免费下载链接】ScanNet项目地址https://gitcode.com/gh_mirrors/sc/ScanNet点击查看免费下载本篇指南完整覆盖 ScanNet 仓库中 CameraParameterEstimation 模块的标定流程如何准备 depth-to-color 与 depth-distortion 两组标定数据、如何用 MATLAB Single Camera Calibration App 估计颜色/红外相机内参与外参、如何用calibrate_depth估计并应用深度畸变查找表LUT、以及如何用calibration_explorer验证标定结果。读完后你将能够独立完成一台结构光 RGB-D 相机作者标定的是 Occipital Structure Sensor的全部参数估计并产出可直接接入 ScanNet 数据管线的parameters.txt与.lut文件。1. 系统总览两类标定与一个验证工具从 CameraParameterEstimation/README.md 可以看到该模块提供一套 MATLAB 脚本加 C 程序用于标定结构光深度相机核心包含两类标定Depth-To-Color 标定输入 20–30 张从不同角度、距离拍摄标定网格的 RGB 红外图像对输出颜色与红外深度相机的内参以及将深度对齐到颜色的刚体变换。依赖 MATLAB 的 Single Camera Calibration AppDepth Distortion 标定Structure Sensor 输出的深度图存在随距离加剧的严重畸变该步骤输入一段约 400 帧作者实验规模的 RGB-D 视频序列场景是一面贴有标定网格的大平面墙且墙面必须覆盖整个视锥输出是一个畸变矫正查找表lookup table并提供 C 程序将其应用到保存为 16-bit PNG 的深度图Validation提供calibration_explorer应用验证标定结果。逐步骤操作详见 CameraParameterEstimation/tutorial/tutorial.md本文在其基础上结合脚本与源码逐项展开。2. Step 1数据准备2.1 两组标定数据的要求针对某台特定设备需要采集两组图像Depth-to-Color约 20–30 张展示标定网格的颜色图像与红外图像需覆盖不同拍摄角度与不同距离Depth-Distortion一段人从墙面走近再走开的视频序列墙面上贴有标定网格。序列中每一帧的墙面都必须覆盖整个视锥entire view frustum。序列中颜色图像保存为 jpg深度图像保存为 16-bit png。如果你要标定自己的相机这就是你替换为自己的数据的位置。教程强烈建议先走一遍完整流程并检查样例数据替换为自己的数据时该设备的标定数据初始目录应满足如下结构calibration_data ├── depth_distortion │ ├── color │ └── depth_raw ├── depth_to_color │ ├── color │ └── infrared └── validate ├── color ├── depth_raw └── validation.conf各子目录用途depth_to_color/color、depth_to_color/infrared存放第一步网格图像对分别供 MATLAB 标定 App 加载depth_distortion/color、depth_distortion/depth_raw存放平面墙序列validate存放用于最终验证的非平面场景图像对与验证用配置。2.2 图像格式的硬约束深度图必须是16-bit PNG像素值为毫米整数源码中统一按depth d * 0.001f换算为米见 calibrate_depth.cpp 与 calibration.h颜色图与红外图像素名必须一一对应同名不同扩展名因为参数导出脚本按文件名生成图像对配置见 export_calibration_info.m。3. Step 2颜色与红外相机的单目标定3.1 MATLAB Single Camera Calibration App 操作步骤在 MATLAB 命令行输入cameraCalibrator加载 App 后按以下步骤操作点击New Session创建新会话点击Add images添加某一组会话的图像——颜色color与红外infrared各做一次即重复该流程两次设置网格参数教程示例中网格方格尺寸为53 mm请改为你自己网格的实际尺寸点击calibrate注意确认相机模型使用2 个畸变系数即估计 2 个径向畸变系数进行优化观察重投影误差它取决于图像分辨率作者实验中 1296x968 的颜色图像平均误差为0.23 px640x480 的红外图像为0.12 px标定完成后将两个标定会话保存到calibration_data文件夹文件名必须分别为color_session.mat与infrared_session.mat。3.2 图像必须成对剔除如果从color中剔除了某些图像网格检测失败、优化外点等则对应的图像必须同时从infrared中剔除——你剔除的是图像对而不是单张图像。这是因为后续颜色-深度外参估计依赖两个会话中逐帧对应的网格点观测见 3.3 节。3.3 源码视角颜色-深度外参是如何估计的parameters.txt中的depthToColorExtrinsics并非手工给定而是由 estimate_pairwise_transform.m 从两个标定会话中自动解出其流程为从color_session与infrared_session中取出WorldPoints棋盘格理想世界坐标、RotationMatrices与TranslationVectors每幅图像的位姿将每个网格点变换到各自相机坐标系世界点 × R t网格平面 z0通过坐标转换矩阵diag(1, -1, -1)统一坐标系朝向调用 estimate_rigid_transform.m基于 Forsyth Ponce《Computer Vision: A Modern Approach》的最小二乘刚体变换估计用 SVD 求最优四元数再经 quat2rot.m 转为旋转矩阵平移向量乘以0.001MATLAB 会话单位为 mm此处换算为米再做一次坐标翻转后写入参数文件。这也解释了为什么颜色与红外两组网格图像必须同场景、成对拍摄刚体变换的求解完全建立在两组观测的逐点对应关系上。4. Step 3参数导出在CameraParameterEstimation/scripts目录下运行脚本export_calibration_info( path to calibration_data folder)它会读取calibration_data/color_session.mat与infrared_session.mat在calibration_data/depth_distortion目录中生成深度畸变标定所需的全部文件parameters.txt、plane_poses.txt以及depth_distortion_calibration.conf。具体逻辑见 export_calibration_info.m导出相机参数调用 export_color_and_ir_params.m 写出parameters.txt估计平面位姿对depth_distortion/color下每张 jpg先用颜色相机参数去畸变再检测棋盘格角点并用extrinsics解算位姿写入plane_poses.txt4x4 矩阵逐行展开%12.8f精度生成 conf写入有效图像数与每个 scan 的图像对。4.1 parameters.txt 完整字段由导出脚本可知parameters.txt是key value文本格式字段及含义如下字段含义colorWidth/colorHeight颜色图像宽高像素depthWidth/depthHeight深度红外图像宽高像素fx_color/fy_color/mx_color/my_color颜色相机焦距与主点fx_depth/fy_depth/mx_depth/my_depth深度相机焦距与主点k1_color/k2_color颜色相机径向畸变系数k3_color/k4_color颜色相机切向畸变系数p1, p2k5_color颜色相机高阶径向项固定写 0.0k1_depth~k5_depth深度相机对应的 5 个畸变系数depthToColorExtrinsics4x4 刚体变换16 个浮点数按行展开米图像尺寸由脚本读取两张会话首图的实际分辨率得到export_color_and_ir_params.m因此颜色与深度分辨率可以不同。4.2 depth_distortion_calibration.conf 格式conf 文件由脚本按如下格式生成见 export_calibration_info.mcalibrate_depth按同样的文法解析n_images 有效图像数 parameters parameters.txt plane_poses plane_poses.txt scan depth_image.png color_image.jpg 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ...其中scan行给出深度图名、颜色图名以及一个单位矩阵占位16 个浮点数解析代码见 calibrate_depth.cpp 的 ReadConfigurationFileplane_poses读取时还会做坐标系翻转并取depthToColorExtrinsics的逆得到 color-to-depth 变换见 ReadPlanePoses。5. Step 4深度畸变标定calibrate_depth5.1 前置条件与运行目录假设你已编译calibrate_depth并加入 PATH其 Makefile 见 makefileg 以-stdc11编译链接 GLEW/GLFW3 与 OpenGL输出到CameraParameterEstimation/bin/。然后cd进入calibration_data/depth_distortion——必须在该目录下运行因为程序以相对路径读取depth_raw/xxx.png并写depth/xxx.png。5.2 估计模式calibrate_depth depth_distortion_calibration.conf --estimate_undistortion name_of_lookup_table.lut这是整个流程中最耗时的步骤耗时取决于机器与使用的图像数量。calibrate_depth的完整命令行参数源码 ParseArgs参数含义默认值configuration_filename位置参数配置文件名无-e, --estimate_undistortion file.lut估计去畸变 LUT 并保存到文件空-a, --apply_undistortion file.lut用 LUT 矫正深度图空-d, --max_depth mLUT 覆盖的最大深度米5-s, --n_slices nLUT 沿 z 轴的切片数z 方向分辨率15-b, --bitshift是否执行 SUN3D 循环位移动circular-bitshift开启-v, --verbose输出额外信息含深度分箱统计关闭-l, --slice_visualization将 LUT 各 z 切片保存为可视化图片关闭其中--bitshift会对 16-bit 深度值做((d 3) 0x1FFF) | ((d 0x7) 13)重排Structure Sensor 的 SUN3D 编码习惯估计与应用两个方向互逆见 ApplyUndistortion 与点云生成处。5.3 估计模式原理源码级EstimateDistortion 的工作流程收集训练数据逐帧读取depth_raw/name.png从对应平面位姿提取墙面平面方程法向量取位姿矩阵第 3 列点取第 4 列平面法向与光轴夹角超过 25°angle_threshold的帧直接跳过这对应采集时“正对墙面走”的要求用深度相机内参 K 将整幅深度图反投影为点云对每个有效像素沿相机光轴方向做光线-平面求交得到该像素的真实深度形成(观测深度, 真实深度)训练对三维分箱累加按x_bin 2、y_bin 2即 320x240 平面分辨率、z_bin n_slices / max_depth划分三维格子累加Σ(观测深度 × 真实深度)与Σ(真实深度²)两者相除得到每个格子的深度缩放乘子——即“该 (u, v, z) 位置上报深度应乘多少才是真实深度”补全图像右侧一条竖带结构光投射盲区用邻近列的值填充仍未覆盖的格子置为 1.0无畸变写出 LUT 文件。LUT 的二进制格式由 grid3d.h 定义头部依次是 3 个int32x/y/z 分辨率与 1 个float最大距离后接 z-major 排布的float数据读取时按三维双线性插值取样Grid3D::GetValue(float, float, float)。5.4 应用模式估计完成后你已拥有应用标定所需的全部文件parameters.txt与lookup_table.lut。运行calibrate_depth depth_distortion_calibration.conf --apply_undistortion name_of_lookup_table.lut其数学操作为对每个深度像素z_idx min(depth × n_slices / max_depth, n_slices-1)从 LUT 取乘子m 1 / LUT(i / x_bin, j / y_bin, z_idx)输出new_depth depth × m单位仍是毫米写入depth/name.png。这套文件格式与 ScanNet 主处理管线通用见第 7 节。另外calibrate_depth不带任何模式参数直接运行时会打开一个可视化窗口让你查看图像矫正前后的效果对比 raw 与 corrected 两套彩色点云并叠加显示墙面网格平面、深度参考平面等支持a/d前后切帧、s切换 raw/corrected、c切换着色、n显示法线、p显示平面以及 ImGui 面板滑条选帧见 Display。6. Step 5标定结果验证calibration_explorer由于“标定是一门玄学”验证结果通常是个好主意。验证数据的准备方式是采集若干非平面场景的图像对平面场景无法暴露注册误差按validate文件夹的层级存放并准备validation.conf。然后运行calibrate_depth validation.conf --apply_undistortion path_to_lookup_table.lut calibration_explorer ../depth_distortion/parameters.txt color/color_filename.jpg depth/depth_filename.jpg第一条命令先把验证深度图用 LUT 矫正第二条打开calibration_explorer源码见 calibration_explorer.cpp窗口中颜色图上叠加深度图可手动调节 alpha 观察对齐程度按m键切换到3D 点云视图进一步检查颜色与深度的贴合情况。6.1 registration 管线calibration_explorer对每一帧执行的标准管线display 中的 should_update 分支对深度图做 5 系数2 径向 2 切向 1 高阶畸变模型去畸变将去畸变后的深度按dK反投影、经depthToColorExtrinsics含坐标系翻转变换、再按cK投影到颜色分辨率用 splat 方式写入颜色尺寸深度图对颜色图同样去畸变后与注册深度叠加显示。参数读取按parameters.txt的字段顺序逐一fscanfread_parameters因此文件顺序不能改动。6.2 手动微调与参数导出所有标定参数都在右侧 ImGui 面板中暴露可按需手动干预深度内参焦距范围 500–650、主点 280–360 / 200–280、深度/颜色畸变系数±1、颜色内参焦距 1000–1250、4x4 外参逐行滑条平移范围 ±0.1。按s键可切换回文件中的初始参数对照。若需要保存修改后的参数给calibration_explorer加上--output_parameters parameters_filename.txt即可将当前面板参数写回同格式文件write_parameters面板中的 Save Ply 按钮还可导出注册后的彩色点云供离线检查。7. 与 ScanNet 处理管线的衔接教程中提到的“这套文件格式同样适用于 ScanNet pipeline”在仓库中有明确落点Calibrate/src/calibration.h 中的Calib::readFromFile逐字段读取与第 4.1 节完全一致的parameters.txtcolorWidth~depthToColorExtrinsics而Calibration::calibrateScan对.sens文件逐帧执行颜色去畸变 → 按 LUT 做距离去畸变undistortDistance查表逻辑与ApplyUndistortion相同→ 深度去畸变 →depthToColor投影对齐 → 无效化无颜色处的深度最后把新内参写回.sens元数据。LUT 的读取类Grid3D在Calibrate/src/grid3d.h中实现与calibrate_depth侧 grid3d.h 为同一二进制格式。因此用本教程产出的两个文件即可被 ScanNet 数据转换/标定工具链直接消费无需格式转换。8. 实操要点速查数据采集depth-to-color 需 20–30 对不同角/距的网格图像对depth-distortion 需整段序列墙面覆盖全部视锥颜色存 jpg、深度存 16-bit png网格尺寸教程示例 53 mm与2 个畸变系数的模型选择必须在 MATLAB App 中显式确认剔除图像必须成对操作parameters.txt与 LUT 生成后calibrate_depth的估计/应用两个模式以及 ScanNet 管线Calibrate工具共享同一套文件格式LUT 默认只覆盖5 米、15 个 z 切片可通过-d/-s调整以适配场景深度范围与精度需求平面帧有25° 倾角的硬性过滤采集时走得越正、覆盖距离越均匀落入训练集的帧越多验证阶段务必使用非平面场景图像对并用calibration_explorer的 2D 叠加 3D 点云双视角确认对齐注意运行目录calibrate_depth依赖当前目录下的depth_raw/、depth/、color/相对路径calibration_explorer的参数文件位置则按命令行给出的相对路径解析教程示例中从validate目录引用../depth_distortion/parameters.txt。赞分享数据集计算机视觉3D视觉【免费下载链接】ScanNet项目地址https://gitcode.com/gh_mirrors/sc/ScanNet点击查看免费下载相关推荐ScanNet 结构光深度相机标定实战Depth-To-Color 与 Depth Distortion 双阶段校准指南ScanNet 结构光深度相机标定实战Depth To Color 与 Depth Distortion 双阶段校准指南 本指南完整讲解 ScanNet 项目数据集计算机视觉3D视觉OpenCV 相机标定实战详解畸变模型、calibrateCameraRO 全流程与标定结果解析OpenCV 相机标定实战详解畸变模型、calibrateCameraRO 全流程与标定结果解析 本篇指南围绕 OpenCV 的相机标定camera cal计算机视觉图像处理深度学习机器学习7步深度相机标定实战指南从原理到精准标定全流程7步深度相机标定实战指南从原理到精准标定全流程 深度相机标定是三维视觉应用的基石直接影响测量精度与系统稳定性。无论是工业检测、机器人导航还是AR/VR开发智能硬件音视频计算机视觉创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考