利用OpenCV进行双目立体匹配三维重建点云的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); %

ID:51100679698651348

双目立体匹配


双目立体匹配与三维重建在计算机视觉中占据着重要地位,能够实现从一对立体图像中恢复出三维场景的几何信息。本文基于网上开源代码进行修改,以实现基于特征点和OpenCV立体匹配算法的三维重建及显示。修改后的代码适用于VS2015 Debug win32版本,并且已经完成了OpenCV相关配置,无论电脑中是否配置OpenCV都可以运行。

本文首先介绍了操作步骤,需要将Reconstuction3d bin中的所有dll拷贝到C: windows sysWOW64(或者system32,根据电脑版本决定)目录下。接着双击打开Reconstuction3d.sln工程,在运行后即可得到结果。

文章接着详细解释了程序的结构和功能。Reconstuction3d.cpp是程序的主函数,cvFuncs.cpp包含了特征点三维重建的算法,包括SIFT、SURF、FAST等算法,而cvFuncs2.cpp则是视差图三维重建的算法,包含BM、SGBM等算法可选择。特征点三维重建的流程包括特征提取、特征描述、特征匹配、三角测距计算点云和原图像三角剖分等步骤。视差图三维重建的流程则包括获取稠密视差图、三角测距计算点云和原图像三角剖分等步骤。

在讨论标定方面时,文章推荐了使用MATLAB手动标定工具箱进行双目标定,尽管MATLAB自动标定精度较低。文章也提到了精度问题,对于精度要求不高且相机畸变不大的情况,可以直接使用未校正的图像进行处理。对于精度要求较高的情况,则需要进行图像校正和获取平行校正后的有效焦距等复杂操作。

此外,文章还提到了关于特征点的设置和调整。通过修改cvFuncs.cpp开头的DETECTOR_TYPE、DESCRIPTOR_TYPE和MATCHER_TYPE参数,可以调整程序的特征提取、特征描述和特征匹配算法。程序设定了描述子匹配的阈值进行粗筛选,并利用RANSAC算法获取单应性矩阵后进行精确筛选。

最后,文章提到了MATLAB点云的显示方法,程序运行后会生成pointcloud.txt文件,可以通过MATLAB进行显示。文章给出了两种显示方法,一种是点显示,另一种是面显示,通过输入相应的MATLAB代码即可实现。

本文通过详细解释程序的结构和功能,展示了双目立体匹配与三维重建的实现过程。介绍了操作步骤、程序详解、标定、精度、特征点设置等相关内容,帮助读者了解并运行该程序。通过修改代码和参数,读者可以根据自己的需求进行定制化的三维重建。该程序的开源特性和便利性使其具有广泛的应用前景,可以在计算机视觉、虚拟现实等领域发挥重要作用。

以上相关代码,程序地址:http://matup.cn/679698651348.html

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现双目立体视觉三维重建C++代码如下: 首先,需要包含OpenCV库的头文件: #include <opencv2/opencv.hpp> 然后,定义双目相机的参数: cv::Mat cameraMatrix1; // 左相机内参矩阵 cv::Mat distCoeffs1; // 左相机畸变系数 cv::Mat cameraMatrix2; // 右相机内参矩阵 cv::Mat distCoeffs2; // 右相机畸变系数 然后,定义图片路径和文件名: std::string leftImagePath = "left.jpg"; // 左图路径和文件名 std::string rightImagePath = "right.jpg"; // 右图路径和文件名 加载左右图片: cv::Mat leftImage = cv::imread(leftImagePath, cv::IMREAD_GRAYSCALE); cv::Mat rightImage = cv::imread(rightImagePath, cv::IMREAD_GRAYSCALE); 接下来,根据相机参数计算立体校正映射矩阵: cv::Mat R, T, R1, R2, P1, P2, Q; cv::stereoRectify(cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, leftImage.size(), R, T, R1, R2, P1, P2, Q); 定义校正后的左右图像: cv::Mat rectifiedLeftImage, rectifiedRightImage; 使用立体校正映射矩阵对左右图像进行校正: cv::remap(leftImage, rectifiedLeftImage, R1, P1, cv::INTER_LINEAR); cv::remap(rightImage, rectifiedRightImage, R2, P2, cv::INTER_LINEAR); 接下来,使用SGBM(Semi-Global Block Matching)算法计算视差图: cv::Mat disparityMap; int minDisparity = 0; int numDisparities = 16; int blockSize = 3; int P1 = 8 * leftImage.channels() * blockSize * blockSize; int P2 = 32 * leftImage.channels() * blockSize * blockSize; cv::StereoSGBM stereoSGBM(minDisparity, numDisparities, blockSize, P1, P2); stereoSGBM(rectifiedLeftImage, rectifiedRightImage, disparityMap); 通过视差图计算深度图: cv::Mat depthMap; double f = cameraMatrix1.at<double>(0, 0); double B = abs(T.at<double>(0, 0)); // 双目相机基线长度 cv::divide(f * B, disparityMap, depthMap); 最后,将深度图进行可视化: cv::normalize(depthMap, depthMap, 0, 255, cv::NORM_MINMAX, CV_8U); cv::imshow("Depth Map", depthMap); cv::waitKey(0); 这段代码实现了双目立体视觉三维重建,通过计算立体校正映射矩阵、视差图和深度图,可以得到场景的三维结构和深度信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值