双目立体匹配三维重建点云C++ 本工程基于网上开源代码进行修改,内容如下: 1.修改为 VS2...
双目立体匹配三维重建点云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); %
双目立体视觉三维重建系统功能说明书
(基于 Reconstruction3d 工程)
================================================================
一、产品定位
----------------------------------------------------------------
“Reconstruction3d” 是一套面向科研与工业检测的轻量级双目立体视觉 SDK。它在 Windows-VC2015 工具链下开箱即用,无需额外安装 OpenCV,即可离线完成“图像→点云→可视化”的全链路实验。系统同时保留特征点稀疏重建与稠密视差图重建两条技术路线,方便开发者快速对比算法效果、验证标定参数或采集训练数据。
================================================================
二、总体架构
----------------------------------------------------------------
┌---------------------------┐
│ 业务层(可执行程序入口) │ Reconstuction3d.cpp
├---------------------------┤
│ 算法策略层(二选一) │
│ • Feature Pipeline │ cvFuncs.cpp
│ • Dense Pipeline │ cvFuncs2.cpp
├---------------------------┤
│ 几何引擎层 │ cvFuncs.cpp / StereoTo3D

├---------------------------┤
│ 可视化层 │ glFuncs.cpp + OpenGL/GLUT
└---------------------------┘
图 1. 逻辑分层示意
系统采用“策略模式”:
- 运行期通过 galgo 枚举量(FEATUREPT / DENSE)动态绑定两套算法,保证单一代码基线,可随时切换。
- 所有算法参数集中在 cpp 文件头部 define 区,方便二次调优而无需改动接口。
================================================================
三、核心流程拆解
----------------------------------------------------------------
- 数据输入与预处理
① 支持 bmp/png 两种常见格式,自动保持灰度或彩色原貌。
② 若图像宽度超过 800 px,自动等比缩放,防止显存爆炸,同时内部记录 resizeScale 供后续焦距折算。
③ 可选“图像校正”步骤:当用户已用 MATLAB 双目标定工具箱获得平行校正图像时,直接载入;否则允许载入原图,系统会在“精度允许范围内”做近似重建。
- 特征点策略(FEATUREPT)
① 特征提取:
– 通过 DETECTORTYPE 宏(FAST/SURF/SIFT…)在编译期决定检测子;
– 输出为 vector,已剔除边界响应。
② 特征匹配:
– 采用 kNN(k=2)+ Lowe 比值检验(默认 0.5)完成粗匹配;
– 使用 findHomography + RANSAC 计算单应矩阵,反投影右图坐标,将误差 > HOMOFILTERTH 的匹配对剔除,保证“几何一致性”。
③ 输出:左右图一一对应的 vector ptsL, ptsR,可直接进入三角测量。
- 稠密视差策略(DENSE)
① 采用 OpenCV StereoSGBM,支持分块并行;
② 后处理链路:
– FixDisparity 函数横向扫描,消除“跳变”异常值;
– 形态学开闭运算,补洞且保留边缘;
③ 自适应采样:对“边缘区域”与“平坦区域”分别设置梯度阈值,抽取 80+50 个代表性像素,既降低点云规模,又保持可视完整性。
- 三角测量(公共模块)
① 坐标系定义:以左相机光心为世界原点,X 向右,Y 向下,Z 向前,符合 OpenCV 约定。
② 公式:
Z = f B / (xl – xr)
X = (cx – xl) Z / f
Y = (cy – yl) * Z / f
其中 f 为像素焦距,B 为基线长度,(cx,cy) 为主点。
③ 异常过滤:当 |Z|>1e4 mm 或 Z≤0 时视为无效点,自动丢弃。
④ 输出:vector pts3D,同时计算 AABB 包围盒,供后续居中显示。
- 网格化与纹理贴图
① 对左图特征点做 Delaunay 剖分,获得三角索引表 vector tri;
② 使用 OpenGL 显示列表(glGenLists)一次性编译:
– 顶点坐标归一化到 [-1,1];
– 纹理坐标映射到 [0,1];
– 采用 GL_MODULATE 模式,保持原图色彩。
③ 支持鼠标滚轮缩放、方向键旋转,方便观察局部细节。
- 点云导出
① 运行目录自动生成 pointcloud.txt(ASCII,三列浮点)。
② 提供示例 MATLAB 脚本,支持:
– 三维散点快速预览;
– griddata+v4 插值后生成表面网格,可用于测量或导入 MeshLab。
================================================================
四、关键参数与调优指南
----------------------------------------------------------------
位置 0:算法切换
Algorithm galgo = FEATUREPT; // 或 DENSE
位置 1:输入图像
imread("./src/l.png"); // 推荐绝对路径,避免中文空格
位置 2:相机内参与基线
float focalLenInPixel = 907.18; // MATLAB 标定 fx
float baselineInMM = 45.39; // 单位毫米,T(0) 绝对值
位置 3:深度缩放因子
float scale = 0.2; // 仅用于显示,不改变真实坐标

若需毫米级真值,请设为 1.0
位置 4:特征匹配阈值
MAXMFILTERTH = 20 // 比值阈值,越小越严格
HOMOFILTERTH = 100 // 反投影像素容差
NEARFILTERTH = 10 // 非极大抑制窗口
位置 5:SGBM 参数
numberOfDisparities 需被 16 整除,范围 16~256;
uniquenessRatio 建议 10~15;
disp12MaxDiff 设为 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); %
================================================================
五、精度与局限性
----------------------------------------------------------------
- 未校正模式:
– 仅当相机本身径向畸变 <0.5 像素、基线/深度比 <0.1 时,误差可控制在 2 cm 内。 - 已校正模式:
– 若 MATLAB 标定重投影误差 <0.15 px,深度误差可逼近 1 cm(1 m 工作距离)。 - 特征点模式:
– 稀疏点云,对弱纹理物体(白墙、纯色桌面)效果差;
– 优势:计算量小,450×350 图像 1 s 内完成。 - 稠密模式:
– 对光照敏感,高光或遮挡区域易产生“黑洞”;
– 优势:点云密度高,可直接用于曲面重建。
================================================================
六、典型使用场景
----------------------------------------------------------------
• 实验室快速验证:换相机后直接修改 fx、B 两个参数即可跑通,无需重写代码。
• 工业检测:在传送带上方固定双目相机,通过“稠密模式”获取产品表面点云,与 CAD 模型做差分检测缺陷。
• 教学演示:对比 FEATURE_PT 与 DENSE 结果,直观展示“稀疏 vs 稠密”、“特征 vs 区域”两种思路。

================================================================
七、二次开发接口
----------------------------------------------------------------
系统已将所有算法步骤封装为独立函数,方便嵌入更大框架:
// 获取匹配点
void GetPair(Mat& imgL, Mat& imgR, vector& ptsL, vector& ptsR);
// 计算 3D 坐标
void StereoTo3D(vector ptsL, vector ptsR,
vector& pts3D, float f, float B, Mat img,
Point3f& center, Vec3f& size);
// 三角剖分
void TriSubDiv(vector& pts, Mat& img, vector& tri);
// 导出点云
void saveXYZ(const char* filename, vector& pts3D);
开发者只需替换自己的图像采集模块,或把 saveXYZ 改为 PCL/ROS 点云格式,即可无缝接入机器人、SLAM 等下游任务。
================================================================
八、运行环境 & 依赖
----------------------------------------------------------------

• 编译器:Visual Studio 2015+ (v140 工具链),Win32 Debug/Release 均可;
• 系统库:自带 OpenCV2.4.8 静态库,无需额外安装;
• 图形库:OpenGL32.dll、GLU32.dll 系统已自带;
• 硬件:≥2G 内存,支持 OpenGL 1.4 以上显卡即可。
================================================================
九、常见问题速查
----------------------------------------------------------------
Q1: 运行提示缺少 MSVCP140D.dll?
→ 安装 VS2015 运行库或改用 Release 编译。
Q2: 点云全部集中在 Z=0 平面?
→ 检查左右图是否顺序颠倒;确认 fx 单位是像素而非毫米。
Q3: 特征点模式匹配数为 0?
→ 降低 MAXMFILTERTH 或更换 DETECTOR_TYPE=SURF;确保图像有足够纹理。
Q4: 稠密模式出现明显条纹?
→ 调大 uniquenessRatio 或减小 numberOfDisparities,让唯一性约束更严格。
================================================================
十、结语
----------------------------------------------------------------

Reconstuction3d 以“零依赖、易编译、可对比”为设计目标,将经典双目几何与现代 GPU 友好渲染整合到最小可运行集合。开发者可在数小时内完成从图像采集、参数标定到点云可视化的全链路验证,为后续科研或产品化奠定坚实基础。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)