用VS+Opencv3.1从双目立体视差图中重建三维点云


转载请注明原创出处:http://blog.csdn.net/u014283958/


基本原理

详细原理请阅读这篇文章http://www.360doc.com/content/14/0205/15/10724725_349968116.shtml.

双目立体视觉几何原理图

基本流程

点云重建基本流程

代码

本代码运行需要在VS上配置好opencv3.1+openNI+PCL,opencv3.1的配置可以在网上找到很多资料,openNI和PCL的配置可以参看上一篇博文下http://blog.csdn.net/u014283958/article/details/52599457
下面是代码:

//by shuishui shiwenjun 20160926
#include <pcl/visualization/cloud_viewer.h>
#include <iostream>  
#include <pcl/io/io.h>  
#include <pcl/io/pcd_io.h>  
#include <opencv2/opencv.hpp>  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值