D330Viewer - D330M深度相机控制系统
项目简介
D330Viewer 是一个基于Qt6的深度相机控制和可视化系统,用于D330M深度相机的实时数据采集、处理和显示。系统采用OpenCL GPU加速进行点云计算,支持实时显示深度图像和3D点云。
技术栈
核心库版本
- Qt6: 6.10.1 (msvc2022_64)
- PCL: 1.15.1 (Point Cloud Library)
- OpenCV: 4.13.0
- OpenCL: 3.0 (GPU加速)
- DkamSDK: 1.6.83 (D330M相机SDK)
开发环境
- 操作系统: Windows 10/11 (64位)
- 编译器: Visual Studio 2026 (MSVC)
- 构建工具: CMake 3.15+
- GPU: 支持OpenCL的GPU(NVIDIA/AMD/Intel)
快速开始
1. 环境准备
确保已安装以下软件:
- Visual Studio 2022 以上(包含C++桌面开发工作负载)
- CMake 3.15或更高版本
- 支持OpenCL的GPU驱动
2. 库依赖安装
必需的库:
- Qt6 6.10.1 (msvc2022_64)
- PCL 1.15.1
- OpenCV 4.13.0
- OpenCL 3.0(通常随GPU驱动自动安装)
安装路径(默认):
- Qt6:
C:\Qt\6.10.1\msvc2022_64 - PCL:
C:\Program Files\PCL 1.15.1 - OpenCV:
C:\opencv\build
3. 配置项目
方式1:使用配置脚本(推荐)
# 需根据本地情况修改库路径,编辑configure.bat
configure.bat
方式2:手动配置
cmake -B build -S . ^
-G "Visual Studio 18 2026" ^
-A x64 ^
-DPCL_DIR="C:/Program Files/PCL 1.15.1/cmake" ^
-DOpenCV_DIR="C:/opencv/build" ^
-DCMAKE_PREFIX_PATH="C:/Qt/6.10.1/msvc2022_64"
注意:
- 如果系统安装了VS 2022,可使用
-G "Visual Studio 17 2022"
4. 编译项目
# Release版本(推荐)
cmake --build build --config Release
# Debug版本 需自行复制Debug版本库文件
cmake --build build --config Debug
编译输出:
- Release:
bin/D330Viewer.exe - Debug:
bin/Debug/D330Viewer.exe
5. 运行程序
cd bin
D330Viewer.exe
注意:首次运行需要确保所有DLL文件都在bin目录下。
6. 生成MSI安装程序(可选)
项目支持生成Windows MSI安装程序,方便在其他电脑上部署。
前置要求:需要安装 WiX Toolset v3.x
安装WiX Toolset:
- 访问 GitHub Release 页面:https://github.com/wixtoolset/wix3/releases
- 下载最新版本的安装包:
wix3xx-binaries.zip- 或
wix3xx.exe
- 如果下载zip文件:
- 解压到
C:\Program Files (x86)\WiX Toolset v3.14\ - 添加bin目录到系统PATH:
C:\Program Files (x86)\WiX Toolset v3.14\bin
- 解压到
- 如果下载exe文件:
- 直接运行安装程序,安装后会自动添加到PATH
验证安装:
candle.exe -?
生成MSI安装程序:
# 编译完成后,在build目录运行
cd build
cpack -G WIX -C Release
生成的安装程序:build/D330Viewer-0.1.0-win64.msi
MSI安装程序包含:
- D330Viewer.exe(主程序)
- 所有必需的DLL
- Qt平台插件(platforms目录)
- 开始菜单快捷方式
- 桌面快捷方式
- 卸载程序快捷方式(开始菜单)
安装目录结构:
C:\Program Files\D330Viewer\
├── D330Viewer.exe # 主程序
├── *.dll # 所有依赖库
└── platforms\ # Qt平台插件
└── qwindows.dll
快捷方式:
- 桌面:D330Viewer(卸载时自动删除)
- 开始菜单:D330Viewer 文件夹
- D330Viewer(启动程序)
- 卸载 D330Viewer(卸载程序)
功能特性
✅ 已完成功能
网络通信
- ✅ UDP网络通信(GVSP协议解析)
- ✅ 自动设备扫描和发现
- ✅ 相机连接管理(连接/断开)
- ✅ 命令发送(START/STOP)
- ✅ 下位机动态切换IP,可随时切换上位机
可视化
- ✅ 实时左红外、右红外相机图像显示
- ✅ 实时RGB相机图像显示
- ✅ 实时3D点云显示(自定义OpenGL渲染)
- ✅ 正交投影视角(平面视图)
- ✅ 交互式点云操作:
- 左键拖动:旋转视角
- 右键拖动:平移
- 滚轮:缩放(范围100-10000)
用户界面
- ✅ Qt6 GUI主窗口(三栏布局)
- ✅ 相机控制面板(START/STOP按钮)
- ✅ 曝光时间调节(滑块,范围460-100000μs)
- ✅ 网络配置(IP地址、端口设置)
- ✅ 连接状态指示
- ✅ 配置持久化(QSettings)
- ✅ 点云颜色映射(深度着色)
- ✅ 多视角预设(正视、侧视、俯视)
🚧 当前开发计划
根据需求文档和用户反馈,后续待添加功能如下:
- 录制功能(连续保存多帧)
- 点云滤波选项(降噪、平滑)
- 测量工具(距离、角度测量)
- 性能监控(CPU/GPU使用率、内存使用)
- 其他相机参数调节(增益、白平衡等)
点云去噪原理与参数说明
去噪处理流程(当前版本)
当前点云去噪不是单一滤波器,而是多阶段组合策略,目标是在保留主体结构的同时抑制放射状无效点和外围杂点。
- 有效点预筛:去掉非有限值和
z<=0的点,得到基础有效掩码。 - 中心ROI深度门控:基于中心区域中位深度自适应裁剪深度窗口,先去掉明显离群深度。
- 邻域一致性筛选:统计每个点在局部窗口内“深度相近邻居”的数量,邻域支持不足的点剔除。
- 形态学轻清理:移除局部孤立残点,减少毛刺。
- 近距离尾部裁剪:对低深度尾部进行比例裁剪,抑制中心放射状噪点。
- 连通簇筛选:按面积、深度一致性和中心重叠等条件保留主簇及相关簇,抑制周边散簇。
- 最终细枝清理:对近距离且邻居不足的细枝点做额外抑制。
- 时序稳定:对关键阈值做帧间平滑和限跳,减少块状点云“时有时无”的闪烁。
三个参数的作用与范围
参数都在“曝光与拍照 -> 拍照参数 -> 点云去噪参数”中,实时生效。
- 邻域支持阈值
- 范围:
3 ~ 12 - 含义:一个点要保留,局部邻域内至少需要多少个深度相近邻居。
- 调大:噪点更少,但边缘和细小结构更容易被吃掉。
- 调小:细节更多,但散点噪声会增加。
- 射线裁剪强度 (‰)
- 范围:
5 ~ 50 - 含义:近距离低深度尾部的裁剪比例(千分比)。
- 调大:中心放射状噪点减少更明显,但近距离真实细节可能减少。
- 调小:近距离细节保留更多,但放射状点可能增多。
- 周边抑制带宽 (‰)
- 范围:
40 ~ 180 - 含义:控制连通簇保留深度带宽、回补范围和近距离毛刺门限。
- 调小:抑制更激进,周边杂点更少,但主体可能偏“硬”、易丢块。
- 调大:主体与细节更完整,但外围杂点回升概率更高。
推荐起始参数
用于室内桌椅等常见场景,可先从以下值起步,再按效果微调:
- 邻域支持阈值:
8 ~ 10 - 射线裁剪强度:
12 ~ 18 - 周边抑制带宽:
90 ~ 130
项目结构
d330viewer/
├── src/ # 源代码
│ ├── main.cpp # 程序入口
│ ├── gui/ # GUI相关
│ │ ├── MainWindow.cpp # 主窗口
│ │ ├── PointCloudWidget.cpp # 点云显示组件
│ │ └── PointCloudGLWidget.cpp # OpenGL点云渲染
│ ├── core/ # 核心功能
│ │ ├── NetworkManager.cpp # 网络通信
│ │ ├── GVSPParser.cpp # GVSP协议解析
│ │ ├── PointCloudProcessor.cpp # OpenCL点云计算
│ │ └── DeviceScanner.cpp # 设备扫描
│ └── config/ # 配置管理
│ └── ConfigManager.cpp # 配置持久化
├── include/ # 头文件
│ ├── gui/ # GUI头文件
│ └── core/ # 核心功能头文件
├── bin/ # 可执行文件和DLL
│ ├── D330Viewer.exe # 主程序
│ └── *.dll # 依赖库
├── build/ # CMake构建目录
├── CMakeLists.txt # CMake配置
├── configure.bat # 快速配置脚本
└── README.md # 本文件
相机配置
硬件信息
- 相机型号: D330M
- 控制端口: 6790 (UDP)
- 数据端口: 3957 (UDP)
- 分辨率: 1224 x 1024
- 深度范围: 155mm - 3000mm
网络配置
确保PC和相机在同一网段即可。
相机参数
- 曝光时间: 460 - 100000 μs
- Z缩放因子: 0.2 (深度值需除以5)
- 相机内参:
- fx = 1432.8957
- fy = 1432.6590
- cx = 637.5117
- cy = 521.8720
下位机程序修改
下位机程序保存在/root/msk/20260113/ 。具体安装和使用详见根目录内INSTALL.md文件。当前版本程序修改功能如下:
- 添加
DISCOVER命令,允许上位机对相机进行自动扫描。保持上位机下位机均DHCP能够正常使用。 - 将程序添加到系统服务中,可以使用
systemctl进行运行和管理
使用说明
基本操作流程
-
启动程序
- 运行
bin/D330Viewer.exe - 程序会自动扫描网络中的D330M相机
- 运行
-
连接相机
- 在设备列表中选择相机
- 点击"连接"按钮
- 状态指示变为绿色"已连接"
-
开始采集
- 点击"启动"按钮开始实时采集
- 深度图显示在中间区域
- 点云显示在右侧区域
-
调整参数
- 拖动曝光滑块调整曝光时间
- 使用鼠标操作点云视角
-
停止采集
- 点击"停止"按钮停止采集
点云交互操作
- 旋转视角: 左键拖动
- 平移: 右键拖动
- 缩放: 滚轮上下滚动
- 复位: 重新启动采集
故障排除
常见问题
1. 无法接收数据
问题: 点击"启动"后没有图像和点云显示
解决方案:
- 图像在长时间传输后有概率卡住,不相应任何命令,具体可监控下位机日志。重启系统服务即可解决。
开发文档
代码规范
- 使用Qt6信号槽机制进行模块间通信
- OpenCL kernel代码内联在C++源文件中
- 配置使用QSettings持久化
- 日志输出到
%LOCALAPPDATA%/Viewer/Viewer/viewer.log(例如C:/Users/<用户名>/AppData/Local/Viewer/Viewer/viewer.log)