1. 项目背景与目标
作为一名计算机视觉方向的实验室成员,我最近完成了一个关于RGB与热成像(thermal)多模态数据集构建的项目。这个项目的核心目标是建立一个可用于三维重建和计算机视觉研究的双模态图像数据集,其中包含常规RGB图像和对应的热成像数据。
多模态数据集在计算机视觉领域具有重要价值,特别是热成像数据能够提供传统RGB图像无法捕捉的温度信息。这类数据集可以应用于安防监控、工业检测、医疗诊断等多个领域。在我们的项目中,我们特别关注如何实现两种模态图像的高精度对齐,这是后续三维重建和算法研究的基础。
2. 设备选型与前期准备
2.1 相机选择
我们选择了FLIR E6 PRO作为主要拍摄设备,这款相机具有以下特点:
- 同时具备RGB和热成像拍摄能力
- 热成像分辨率:160×120像素(可插值到640×480)
- RGB分辨率:1440×1080像素
- 温度测量范围:-20°C至250°C
- 热灵敏度:<0.06°C
选择这款相机主要基于以下考虑:
- 与论文《THERMALGAUSSIAN: THERMAL 3D GAUSSIAN SPLATTING》使用相同设备,便于方法复现
- 相对便携,适合室外拍摄
- 价格在实验室预算范围内(约2万元)
2.2 标定板的选择与教训
在项目初期,我们犯了一个关键错误:为了节省成本,购买了仅适用于RGB标定的普通标定板(250元),而忽略了热成像标定的需求。这导致了以下问题:
- 热成像模式下无法识别标定板图案
- 尝试各种DIY方案(如金属板、特殊涂料)均告失败
- 最终不得不重新购买专业的多模态标定板(600元)
这个教训让我们深刻认识到:在科研设备上,不该省的钱绝对不能省。错误的标定板不仅浪费了2天时间,还影响了整体项目进度。
3. 图像对齐的核心挑战与解决方案
3.1 初始方案的问题
我们最初计划直接复现论文中的对齐方法,但很快发现论文提供的转换公式存在严重错误:
错误的公式示例: [3×3矩阵] × [1×2矩阵] = 维度不匹配经过验证,这个公式完全无法使用,因为它忽略了关键的深度信息,导致对齐误差极大。
3.2 改进的对齐方案
经过研究,我们采用了基于单应性矩阵的几何对齐方法:
- 计算热成像到RGB的单应性矩阵H_th2rgb
- 求逆得到H_rgb2th
- 使用平面诱导单应公式:
其中:H_th2rgb = K_rgb * (R - t n^T / d) * K_th^{-1}- K_rgb和K_th分别是RGB和热成像相机的内参矩阵
- R和t是旋转和平移矩阵
- n和d是平面参数
这种方法虽然比论文方法更合理,但仍存在几个像素的误差,无法满足我们的精度要求。
3.3 三级微调方案
为了解决剩余的对齐误差,我们开发了一套"微调"方案,包含三个层次的校正:
3.3.1 全局平移校正
使用相位相关法计算整体偏移:
# 相位相关计算全局平移 ys, xs = _center_roi_slices(out_h, out_w, refine_center_roi_ratio) dx, dy, resp = _refine_translation_phase(th_edge[ys, xs], rgb_edge[ys, xs]) # 有效性过滤 maxs = float(max(0.0, refine_max_shift)) if maxs > 0 and (abs(dx) > maxs or abs(dy) > maxs): dx = np.clip(dx, -maxs, maxs) dy = np.clip(dy, -maxs, maxs) # NCC验证 if refine_accept_if_improves_ncc: score0 = _masked_ncc_f32(th_edge, rgb_edge, valid_mask_preview) M = np.array([[1.0, 0.0, dx], [0.0, 1.0, dy]], dtype=np.float32) rgb_edge_s = cv2.warpAffine(rgb_edge, M, (out_w, out_h)) valid_mask_s = cv2.warpAffine((valid_mask_preview*255).astype(np.uint8), M, (out_w, out_h)) > 0 score1 = _masked_ncc_f32(th_edge, rgb_edge_s, valid_mask_s) improve = score1 - score0 accepted = improve >= refine_min_ncc_improve # 融合平移到单应矩阵 if accepted and (dx != 0.0 or dy != 0.0): T = np.array([[1.0, 0.0, dx], [0.0, 1.0, dy], [0.0, 0.0, 1.0]], dtype=np.float64) H_rgb2th_used = T @ H_rgb2th_used3.3.2 局部变形校正
将图像分网格计算局部偏移:
# 网格相位计算局部位移 dx_grid, dy_grid, cells = _grid_phase_field( th_edge, rgb_edge, valid_mask.astype(np.bool_), grid_rows=grid_rows, grid_cols=grid_cols, window_scale=grid_window_scale, min_valid_ratio=grid_min_valid_ratio, min_response=grid_min_response, max_shift=grid_max_shift ) # 稠密位移场生成+平滑 dx_full = cv2.resize(dx_grid, (out_w, out_h), interpolation=cv2.INTER_CUBIC) dy_full = cv2.resize(dy_grid, (out_w, out_h), interpolation=cv2.INTER_CUBIC) if grid_smooth_sigma > 0: dx_full = cv2.GaussianBlur(dx_full, (0,0), sigmaX=grid_smooth_sigma) dy_full = cv2.GaussianBlur(dy_full, (0,0), sigmaX=grid_smooth_sigma) # 应用稠密位移场 if grid_apply_to == "bgr": rgb_warp = _apply_dense_shift_remap(rgb_warp_global, dx_full, dy_full) else: rgb_u8 = _apply_dense_shift_remap(rgb_u8, dx_full, dy_full)3.3.3 边缘处理
我们发现强行校正边缘会导致图像变形,因此决定:
- 保留前两级校正的结果
- 对边缘区域进行适度裁剪
- 接受边缘存在轻微不对齐
这种妥协在实际应用中影响不大,因为边缘区域通常不是关注重点。
4. 数据采集的实践挑战
4.1 室外场景拍摄难题
我们原计划采集8个不同场景(4室内+4室外),但室外拍摄遇到了诸多困难:
- 光线问题:早中晚三个时段的太阳角度不同,导致阴影区域变化
- 温度变化:需要等待自然温度变化,时间成本高
- 设备限制:相机RGB模块质量较差(仅1440×1080),在逆光条件下表现不佳
- 重拍成本:发现问题时往往需要等到第二天才能重拍
最终我们只完成了5个场景(3室内+2室外),对于最后一个室外场景,我们创造性地使用了两桶热水制造温差,通过水温的自然下降来模拟温度变化。
4.2 室内拍摄经验
相比之下,室内拍摄较为顺利,主要经验包括:
- 采用平移拍摄而非跳跃拍摄,保证视角连续性
- 使用三脚架固定拍摄高度和角度
- 对于食物等温度变化快的场景,加快拍摄节奏
- 尽量选择人员流动少的时段进行拍摄
5. 三维重建与后期处理
5.1 COLMAP处理难题
在使用COLMAP进行三维重建时,我们遇到了匹配成功率低的问题(仅20-30%)。经过排查,发现:
- 对齐后的图像特征点变化较大,影响匹配
- 相机内参估计不准确
5.2 改进方案
我们开发了以下解决方案:
- 先用原始RGB图像进行COLMAP处理,获得准确的内参
- 基于这些内参估计对齐后图像的内参
- 进行适度微调,将匹配成功率提升到可接受水平
这种方法虽然增加了处理步骤,但显著提高了重建质量。
6. 项目总结与经验分享
6.1 技术收获
- 实战能力:从理论到实践的完整流程经验
- 问题解决:学会查阅论文、调试代码、多角度尝试解决方案
- 科研认知:理解了数据集构建的完整考虑因素
6.2 项目管理经验
- 设备采购:专业设备值得投资,节省的成本可能以时间为代价
- 时间规划:室外拍摄要预留充足缓冲时间
- 流程优化:建立标准化操作流程可以提高效率
- 应急方案:提前设想可能的失败场景并准备应对措施
6.3 后续改进方向
- 开发更鲁棒的对齐算法,减少人工干预
- 优化拍摄流程,提高室外场景采集效率
- 探索更多应用场景,如动态物体追踪
- 考虑开源数据集,促进相关研究发展
这个项目虽然充满挑战,但为我们后续的研究奠定了坚实基础。通过实践,我们不仅获得了技术上的成长,更培养了解决实际问题的能力。在科研道路上,这样的实战经验远比书本知识来得珍贵。