双目立体匹配三维重建点云C++ 本工程基于网上开源代码进行修改,内容如下: 1.修改为 VS2015 Debug win32 版本,支持利用特征点和 OpenCV 立体匹配算法进行进行三维重建及显示,相关代码需要自行修改,代码中添加了修改注释。 2.工程依赖库为 OpenCV2.4.8,内部已完成 OpenCV 相关配置。 无论电脑中是否配置Opencv 都可以运行。 并且增加了点云保存,可以用MATLAB 显示点云。 一、操作步骤 1.解压后将 Reconstuction3d/bin 中的所有 dll 拷贝到C:/windows/sysWOW64 或者system32 根据电脑版本决定,64 位为 sysWOW64。 2.双击 Reconstuction3d.sln 打开工程,运行后出现结果。 二、程序详解 Reconstuction3d.cpp 为程序主函数 cvFuncs.cpp 为特征点三维重建。 包含SIFT、SURF、FAST 等算法。 cvFuncs2.cpp 为视差图三维重建.包含 BM、SGBM 等算法可以选择两者中的一个进行重建,推荐特征点。 特征点三维重建流程: 特征提取->特征描述->特征匹配->三角测距计算点云->原图像三角剖分->点云贴图显示视差图三维重建流程: 获取稠密视差图->三角测距计算点云->原图像三角剖分->点云贴图显示 关于标定 双目标定推荐MATLAB 手动标定工具箱(MATALB 自动标定精度低) 关于精度 如果要求精度不高(2cm 以上)且相机畸变不大,可以直接在【需要调整参数的位置 1】 输入未校正的图像。 在【需要调整参数的位置 2】修改 focalLenInPixel 为 MATLAB 标定后的 fx, 此时左右相机 fx 及 fy 应该相差不大。 baselineInMM 为基线长度,一般为MTALAB 标定后 的平移向量 T 的第一个参数的绝对值。 如果精度要求较高(1cm 以下)需要输入校正过的图像。 此时较为复杂,首先需要MATLAB 获取双目的标定结果,利用附带的标定校正程序进行图像校正,获取平行校正后的有效焦距 fx,此时左右相机的 fx 相等,为理想的平行式立体视觉。 关于特征点 修改cvFuncs.cpp 开头的 DETECTOR_TYPE、DESCRIPTOR_TYPE、MATCHER_TYPE ,即可调整本程序的特征提取、特征描述、特征匹配算法。 本程序设定描述子匹配的阈值来进行粗筛选, 利用RANSAC 算法获取单应性矩阵后反投影,进行精确筛选。 关于 MATLAB 点云 程序运行之后,会在 Reconstuction3d 目录生成 pointcloud.txt 文件,利用 MATLAB 进行显示, 新建脚本输入以下代码运行即可。 第一种:点显示 clear A=importdata(‘pointcloud.txt’); [IX,IY]=size(A); x=A(:,1); y=A(:,1); y=A(:,2); z=A(:,3); plot3(x,y,z,’.’); grid on 第二种:面显示 A = load(‘pointcloud.txt’); %读入数据 %x,y,z 轴坐标 x=A(:,1); y=A(:,2); z=A(:,3); scatter3(x,y,z); %散点图[X,Y,Z]=griddata(x,y,z,linspace(min(x),max(x))’,linspace(min(y),max(y)),‘v4’); %构造坐标点pcolor(X,Y,Z); shading interp; %伪彩色图contourf(X,Y,Z); %等高线图figure,surf(X,Y,Z); %

1. 概述

本工程名为 Reconstuction3d,是一个基于 OpenCV 2.4.8 实现的双目视觉三维重建系统。该系统支持两种主流重建模式:基于特征点稀疏重建基于视差图的稠密重建,适用于不同精度需求与应用场景。工程已适配 Visual Studio 2015(Debug Win32),并内嵌所需 OpenCV 依赖库,具备良好的可移植性与开箱即用特性。

系统输出为三维点云数据(pointcloud.txt),可直接导入 MATLAB 进行可视化,支持点云散点图、曲面重建、等高线等多种显示方式。


2. 系统架构与核心模块

整个系统由三个核心模块组成:

  • 主控模块(main.cpp):负责程序初始化、参数配置、模式选择与结果调度。
  • 特征点重建模块(cvFuncs.cpp):实现基于关键点检测、描述、匹配及三角测量的稀疏三维重建。
  • 视差图重建模块(cvFuncs2.cpp):基于 OpenCV 立体匹配算法(如 BM、SGBM)生成稠密视差图,并转换为三维点云。

用户可通过修改全局枚举变量 galgoFEATUREPT(特征点)与 DENSE(稠密视差)之间切换重建策略。


3. 重建流程详解

3.1 特征点三维重建流程(推荐)

该模式适用于对计算效率要求较高、或纹理丰富但无需完整表面重建的场景。

双目立体匹配三维重建点云C++ 本工程基于网上开源代码进行修改,内容如下: 1.修改为 VS2015 Debug win32 版本,支持利用特征点和 OpenCV 立体匹配算法进行进行三维重建及显示,相关代码需要自行修改,代码中添加了修改注释。 2.工程依赖库为 OpenCV2.4.8,内部已完成 OpenCV 相关配置。 无论电脑中是否配置Opencv 都可以运行。 并且增加了点云保存,可以用MATLAB 显示点云。 一、操作步骤 1.解压后将 Reconstuction3d/bin 中的所有 dll 拷贝到C:/windows/sysWOW64 或者system32 根据电脑版本决定,64 位为 sysWOW64。 2.双击 Reconstuction3d.sln 打开工程,运行后出现结果。 二、程序详解 Reconstuction3d.cpp 为程序主函数 cvFuncs.cpp 为特征点三维重建。 包含SIFT、SURF、FAST 等算法。 cvFuncs2.cpp 为视差图三维重建.包含 BM、SGBM 等算法可以选择两者中的一个进行重建,推荐特征点。 特征点三维重建流程: 特征提取->特征描述->特征匹配->三角测距计算点云->原图像三角剖分->点云贴图显示视差图三维重建流程: 获取稠密视差图->三角测距计算点云->原图像三角剖分->点云贴图显示 关于标定 双目标定推荐MATLAB 手动标定工具箱(MATALB 自动标定精度低) 关于精度 如果要求精度不高(2cm 以上)且相机畸变不大,可以直接在【需要调整参数的位置 1】 输入未校正的图像。 在【需要调整参数的位置 2】修改 focalLenInPixel 为 MATLAB 标定后的 fx, 此时左右相机 fx 及 fy 应该相差不大。 baselineInMM 为基线长度,一般为MTALAB 标定后 的平移向量 T 的第一个参数的绝对值。 如果精度要求较高(1cm 以下)需要输入校正过的图像。 此时较为复杂,首先需要MATLAB 获取双目的标定结果,利用附带的标定校正程序进行图像校正,获取平行校正后的有效焦距 fx,此时左右相机的 fx 相等,为理想的平行式立体视觉。 关于特征点 修改cvFuncs.cpp 开头的 DETECTOR_TYPE、DESCRIPTOR_TYPE、MATCHER_TYPE ,即可调整本程序的特征提取、特征描述、特征匹配算法。 本程序设定描述子匹配的阈值来进行粗筛选, 利用RANSAC 算法获取单应性矩阵后反投影,进行精确筛选。 关于 MATLAB 点云 程序运行之后,会在 Reconstuction3d 目录生成 pointcloud.txt 文件,利用 MATLAB 进行显示, 新建脚本输入以下代码运行即可。 第一种:点显示 clear A=importdata(‘pointcloud.txt’); [IX,IY]=size(A); x=A(:,1); y=A(:,1); y=A(:,2); z=A(:,3); plot3(x,y,z,’.’); grid on 第二种:面显示 A = load(‘pointcloud.txt’); %读入数据 %x,y,z 轴坐标 x=A(:,1); y=A(:,2); z=A(:,3); scatter3(x,y,z); %散点图[X,Y,Z]=griddata(x,y,z,linspace(min(x),max(x))’,linspace(min(y),max(y)),‘v4’); %构造坐标点pcolor(X,Y,Z); shading interp; %伪彩色图contourf(X,Y,Z); %等高线图figure,surf(X,Y,Z); %

流程如下:

  1. 图像预处理
    读取左右相机图像,可选择是否使用经标定校正后的图像(影响重建精度)。
  1. 特征提取与描述
    支持多种经典特征算子(如 SIFT、SURF、FAST 等),通过宏定义 DETECTORTYPEDESCRIPTORTYPE 灵活切换。每幅图像生成一组关键点及其描述子。
  1. 特征匹配与筛选
    - 初步匹配采用描述子距离阈值进行粗筛;
    - 进一步通过 RANSAC 算法估计单应性矩阵(Homography),剔除误匹配点对;
    - 保留高置信度的匹配点用于后续三角测量。
  1. 三角测距与点云生成
    利用相机内参(焦距 focalLenInPixel)与外参(基线长度 baselineInMM),结合匹配点坐标,通过三角测量原理计算三维空间坐标。
  1. 点云输出
    将重建的三维点坐标写入 pointcloud.txt,格式为 (x, y, z),每行一个点。

3.2 视差图三维重建流程

该模式适用于需要完整表面信息、对细节还原要求较高的场景,但计算开销较大。

流程如下:

  1. 立体匹配
    使用 OpenCV 提供的块匹配(BM)或半全局匹配(SGBM)算法,生成左右图像间的稠密视差图。
  1. 深度计算
    基于视差值、相机焦距与基线长度,利用公式:
    $$
    Z = \frac{f \cdot B}{d}
    $$
    其中 $f$ 为焦距(像素),$B$ 为基线(毫米),$d$ 为视差(像素),计算每个像素的深度。
  1. 三维坐标反投影
    结合图像坐标 $(u, v)$ 与深度 $Z$,通过相机成像模型反投影至世界坐标系,生成稠密点云。
  1. 点云输出
    同样保存为 pointcloud.txt,支持后续可视化。

4. 标定与参数配置

4.1 相机标定建议

  • 高精度场景(<1cm)
    强烈建议使用 MATLAB 双目标定工具箱进行手动标定,获取精确的内参($fx, fy, cx, cy$)、畸变系数及外参(旋转 $R$、平移 $T$)。随后使用标定结果对原始图像进行立体校正(Rectification),确保极线对齐,此时左右相机焦距一致,基线方向与图像横轴平行。
  • 低精度场景(>2cm)
    可直接使用未校正图像,仅需在代码中配置近似焦距与基线长度。基线长度通常取标定所得平移向量 $T$ 的第一个分量绝对值。

⚠️ 注意:若使用校正图像,则 `focalLenInPixel` 应取校正后有效焦距;若使用原始图像,则需谨慎评估畸变影响。

4.2 关键参数位置

工程中标注了多个“需要调整参数的位置”,主要包括:

  • 位置 0:选择重建算法(FEATURE_PT / DENSE);
  • 位置 1:指定输入图像路径(是否校正);
  • 位置 2:设置 focalLenInPixelbaselineInMM
  • 位置 3~5:调整特征匹配阈值、RANSAC 参数、立体匹配窗口大小等。

5. 点云可视化(MATLAB)

程序运行后自动生成 pointcloud.txt。用户可使用以下 MATLAB 脚本进行可视化:

方式一:散点图(适用于稀疏点云)

A = importdata('pointcloud.txt');
x = A(:,1); y = A(:,2); z = A(:,3);
plot3(x, y, z, '.'); grid on; axis equal;

方式二:曲面重建(适用于稠密点云)

A = load('pointcloud.txt');
x = A(:,1); y = A(:,2); z = A(:,3);
scatter3(x, y, z, '.'); hold on;
[X, Y] = meshgrid(linspace(min(x), max(x)), linspace(min(y), max(y)));
Z = griddata(x, y, z, X, Y, 'v4');
surf(X, Y, Z); shading interp;

6. 工程部署说明

  1. 依赖库:工程已内嵌 OpenCV 2.4.8 的 Debug 版本 .lib.dll 文件。
  2. 运行环境:需将 Reconstuction3d/bin/ 下所有 .dll 文件复制至系统目录:
    - 64 位系统 → C:\Windows\SysWOW64
    - 32 位系统 → C:\Windows\System32
  3. 编译运行:直接双击 .sln 文件,使用 VS2015 打开并运行即可。

7. 总结

本工程提供了一套完整、可配置、易部署的双目三维重建解决方案,兼顾灵活性实用性。通过模块化设计,用户可根据实际需求选择重建策略,并通过标定优化提升精度。输出标准化的点云格式,便于后续处理与分析,适用于教学演示、机器人导航、工业检测等多种应用场景。

项目基于开源代码二次开发,保留了良好的扩展性,未来可集成深度学习匹配、多视角融合、实时重建等高级功能。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐