OpenCV学习笔记(19)双目测距与三维重建的OpenCV实现问题集锦(四)三维重建与OpenGL显示

 

五、三维重建与 OpenGL 显示

.

在获取到视差数据后,利用 OpenCV reProjectImageTo3D 函数结合 Bouquet 校正方法得到的 Q 矩阵就可以得到环境的三维坐标数据,然后利用 OpenGL 来实现三维重构。 OpenCV OpenGL 的编程范例,我在 学习笔记( 15 中有详细的讨论,这里就不重复了,下面补充一些细节问题:

.

1.             reProjectImageTo3D 是怎样计算出三维坐标数据的?

 

22

.

 

相信看过 OpenCV 12 章的朋友对上图中的 Q 矩阵不会陌生,根据以上变换公式,按理说 OpenCV 应该也是通过矩阵运算的方式来计算出三维坐标数据的,但实际上仔细查看源代码,会发现 cvReprojectImageTo3D 用了比较奇怪的方法来实现,主要代码如下:

 

  • 14
    点赞
  • 144
    收藏
    觉得还不错? 一键收藏
  • 36
    评论
实现双目立体视觉三维重建的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); 这段代码实现双目立体视觉三维重建,通过计算立体校正映射矩阵、视差图和深度图,可以得到场景的三维结构和深度信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值