1. 项目概述
最近在研究3D视觉算法时,我萌生了一个有趣的想法:能否用普通的RGBD深度相机实现物体的3D重建?这个想法源于对市面上一些3D建模工具的观察,比如腾讯混元3D大模型和拓竹3D打印品牌的手机建模功能。它们虽然方便,但受限于手机缺乏深度信息,重建效果往往不尽如人意。
于是,我决定自己动手尝试用奥比中光Gemini深度相机(分辨率960x540)来重建一个橘子。选择橘子有两个原因:一是它表面特征相对简单,二是...好吧,我承认主要是因为实验结束后可以吃掉它!
这个项目涉及的技术栈相当丰富:
- 2D视觉算法:HSV色彩滤波、深度滤波
- 3D视觉算法:点云计算、Harris角点检测、特征匹配、SFM(Structure from Motion)8点法、ICP(Iterative Closest Point)精配准
- 数学工具:最小二乘法、SVD分解、矩阵运算
整个流程分为7个步骤,但由于硬件限制,第7步"质心法计算平移向量"尚未验证。下面我就详细分享这个项目的实现过程和踩过的坑。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心算法解析
2.1 数据准备与预处理
使用深度相机拍摄时,每个视角需要准备:
- 前景点云(含物体的ply文件)
- 背景点云(远景信息的ply文件)
- RGB图像
关键预处理步骤:
-
色彩滤波:
- 将RGB转为HSV空间
- 计算H(色调)和S(饱和度)的均值与标准差
- 设定阈值(H阈值5,S阈值25)过滤异常像素
- 问题:当背景与物体颜色相近时效果会变差
-
深度滤波:
- 结合物体位置信息,过滤深度过大的点
- 膨胀处理(5x5全1核,迭代1次)增强空间连续性
注意:背景点云不需要去除前景物体,但要过滤无效深度点。这个设计后来被证明是个隐患,导致后续点云拼接出现杂质。
2.2 Harris角点检测
Harris算子的核心是检测像素强度的变化:
- 使用Sobel算子计算XY方向梯度
- 构建2x2特征矩阵M
- 计算响应函数R = det(M) - k·trace(M)² (k取0.04)
我做了几个优化:
- 像素值归一化到[0,1]保证阈值体系一致
- 动态阈值:最大R值×比例系数(设为0.01)
- 限制最大角点数
