双目立体匹配三维重建点云系统:基于VS2015与OpenCV的立体匹配算法实现及点云保存显示

张开发
2026/4/12 19:01:57 15 分钟阅读

分享文章

双目立体匹配三维重建点云系统:基于VS2015与OpenCV的立体匹配算法实现及点云保存显示
双目立体匹配三维重建点云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 Aimportdata(‘pointcloud.txt’); [IX,IY]size(A); xA(:,1); yA(:,1); yA(:,2); zA(:,3); plot3(x,y,z,’.’); grid on 第二种面显示 A load(‘pointcloud.txt’); %读入数据 %x,y,z 轴坐标 xA(:,1); yA(:,2); zA(:,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已剔除边界响应。② 特征匹配– 采用 kNNk2 Lowe 比值检验默认 0.5完成粗匹配– 使用 findHomography RANSAC 计算单应矩阵反投影右图坐标将误差 HOMOFILTERTH 的匹配对剔除保证“几何一致性”。③ 输出左右图一一对应的 vector ptsL, ptsR可直接进入三角测量。稠密视差策略DENSE① 采用 OpenCV StereoSGBM支持分块并行② 后处理链路– FixDisparity 函数横向扫描消除“跳变”异常值– 形态学开闭运算补洞且保留边缘③ 自适应采样对“边缘区域”与“平坦区域”分别设置梯度阈值抽取 8050 个代表性像素既降低点云规模又保持可视完整性。三角测量公共模块① 坐标系定义以左相机光心为世界原点X 向右Y 向下Z 向前符合 OpenCV 约定。② 公式Z fB / (xl – xr)X (cx – xl)Z / fY (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.txtASCII三列浮点。② 提供示例 MATLAB 脚本支持– 三维散点快速预览– griddatav4 插值后生成表面网格可用于测量或导入 MeshLab。四、关键参数与调优指南----------------------------------------------------------------位置 0算法切换Algorithm galgo FEATUREPT; // 或 DENSE位置 1输入图像imread(./src/l.png); // 推荐绝对路径避免中文空格位置 2相机内参与基线float focalLenInPixel 907.18; // MATLAB 标定 fxfloat baselineInMM 45.39; // 单位毫米T(0) 绝对值位置 3深度缩放因子float scale 0.2; // 仅用于显示不改变真实坐标若需毫米级真值请设为 1.0位置 4特征匹配阈值MAXMFILTERTH 20 // 比值阈值越小越严格HOMOFILTERTH 100 // 反投影像素容差NEARFILTERTH 10 // 非极大抑制窗口位置 5SGBM 参数numberOfDisparities 需被 16 整除范围 16~256uniquenessRatio 建议 10~15disp12MaxDiff 设为 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 Aimportdata(‘pointcloud.txt’); [IX,IY]size(A); xA(:,1); yA(:,1); yA(:,2); zA(:,3); plot3(x,y,z,’.’); grid on 第二种面显示 A load(‘pointcloud.txt’); %读入数据 %x,y,z 轴坐标 xA(:,1); yA(:,2); zA(:,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 cm1 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: 点云全部集中在 Z0 平面→ 检查左右图是否顺序颠倒确认 fx 单位是像素而非毫米。Q3: 特征点模式匹配数为 0→ 降低 MAXMFILTERTH 或更换 DETECTOR_TYPESURF确保图像有足够纹理。Q4: 稠密模式出现明显条纹→ 调大 uniquenessRatio 或减小 numberOfDisparities让唯一性约束更严格。十、结语----------------------------------------------------------------Reconstuction3d 以“零依赖、易编译、可对比”为设计目标将经典双目几何与现代 GPU 友好渲染整合到最小可运行集合。开发者可在数小时内完成从图像采集、参数标定到点云可视化的全链路验证为后续科研或产品化奠定坚实基础。

更多文章