双目立体匹配三维重建点云C++

双目立体匹配三维重建点云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); %

YID:51100679698651348双目立体匹配