opencv中双目视觉立体重建根据的是三角形原理,在经过摄像机立体标定之后获取到单个摄像机的参数和双目系统的立体参数,根据三角形原理,我们即可实现对点云的三维重建,这里我们只介绍对单个点的三维重建。

具体见如下代码:

#include <string>
#include <opencv2\opencv.hpp>//从.yml文件中读取摄像机参数
bool load_calibration_yml(std::string& file_name, cv::Mat& cam_k_left, cv::Mat& cam_k_right,cv::Mat& cam_kc_left, cv::Mat& cam_kc_right, cv::Mat& R, cv::Mat& T)
{cv::FileStorage fs(file_name, cv::FileStorage::READ);if (!fs.isOpened()){return false;}fs["cam_K_left"] >> cam_k_left;if (3 != cam_k_left.rows || 3 != cam_k_left.cols){std::cout << "Load cam_K_left failed" << std::endl;return false;}fs["cam_kc_left"] >> cam_kc_left;if (1 != cam_kc_left.rows || 5 != cam_kc_left.cols){std::cout << "Load cam_kc_left failed" << std::endl;return false;}fs["cam_K_right"] >> cam_k_right;if (3 != cam_k_right.rows || 3 != cam_k_right.cols){std::cout << "Load cam_K_right failed" << std::endl;return false;}fs["cam_kc_right"] >> cam_kc_right;if (1 != cam_kc_left.rows || 5 != cam_kc_left.cols){std::cout << "Load cam_kc_right failed" << std::endl;return false;}fs["R"] >> R;if (3 != R.rows || 3 != R.cols){std::cout << "Load R failed" << std::endl;return false;}fs["T"] >> T;if (3 != T.rows || 1 != T.cols){std::cout << "Load T failed" << std::endl;return false;}return false;}//对单个点进行畸变校正
void undist_point(cv::Point2d& input, cv::Point2d&  output, cv::Mat& K, cv::Mat& kc)
{double x = (input.x - K.at<double>(0, 2)) / K.at<double>(0, 0);double y = (input.y - K.at<double>(1, 2)) / K.at<double>(1, 1);double r = std::sqrt(std::pow(x, 2) + std::pow(y, 2));double theta = std::atan(r / FOCAL_LENTH);double theta_3 = std::pow(theta, 3);double theta_5 = std::pow(theta, 5);double theta_7 = std::pow(theta, 7);double theta_9 = std::pow(theta, 9);double theta_f = theta * kc.at<double>(0, 0) + theta_3 * kc.at<double>(0, 1) + theta_5 * kc.at<double>(0, 2) + theta_7 * kc.at<double>(0, 3) + theta_9 * kc.at<double>(0, 4);//std::cout << "theta_f= " << theta_f << std::endl;double phi = std::atan(std::abs(y) / std::abs(x));output.x = x / std::abs(x) * std::cos(phi) * theta_f * K.at<double>(0, 0) + K.at<double>(0, 2);output.y = y / std::abs(y) * std::sin(phi) * theta_f * K.at<double>(1, 1) + K.at<double>(1, 2);return;
}//对单个点进行三角化立体重建
void triangulate_stereo(cv::Mat & K1, cv::Mat & kc1, cv::Mat & K2, cv::Mat & kc2, cv::Mat & Rt,cv::Mat & T, cv::Point2d & p1, cv::Point2d & p2, cv::Point3d & p3d)
{cv::Point2d outp1, outp2;undist_point(p1, outp1, K1, kc1);undist_point(p2, outp2, K2, kc2);//std::cout << "undist_left = " << outp1 << std::endl;//std::cout << "undist_right = " << outp2 << std::endl;double f1 = std::sqrt(std::pow(K1.at<double>(0, 0), 2) + std::pow(K1.at<double>(1, 1), 2)) * FOCAL_LENTH;double f2 = std::sqrt(std::pow(K2.at<double>(0, 0), 2) + std::pow(K2.at<double>(1, 1), 2)) * FOCAL_LENTH;cv::Point3d u1(outp1.x, outp1.y, f1);cv::Point3d u2(outp2.x, outp2.y, f2);cv::Point3d w1 = u1;cv::Point3d w2 = cv::Point3d(cv::Mat(Rt*(cv::Mat(u2))));//std::cout << "w1 = " << w1 << std::endl;//std::cout << "w2 = " << w2 << std::endl;double disparity = w1.x - w2.x;double X = w1.x - K1.at<double>(0, 2);double Y = w1.y - K1.at<double>(1, 2);double Z = f1;double W = disparity * (-1/T.at<double>(0, 0)) + (K1.at<double>(0, 2) - K2.at<double>(0, 2))/T.at<double>(0, 0);p3d.x = X / W;p3d.y = Y / W;p3d.z = Z / W;return;
}

2017.05.11

【OpenCV3】基于双目视觉的三维重建相关推荐

  1. 基于双目视觉的三维重建C++实战

    就在一年前,在我开始写这篇文章之前,我观看了特斯拉人工智能总监 Andrej Karapathy 的一次演讲,他向世界展示了特斯拉汽车如何使用连接到汽车上的摄像头感知深度.在 3D 中重建其周围环境并 ...

  2. matlab 立体双目,correl sp matlab 实现双目视觉的三维重建 利用两张图片 信息 276万源代码下载- www.pudn.com...

    文件名称: correlCorresp下载  收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 759 KB 上传时间: 2015-05-26 下载次数: 67 提 ...

  3. 论文《基于结构光和双目视觉的三维重建系统研究》摘要

    <基于结构光和双目视觉的三维重建系统研究>-赵焕谦-哈工大 一.引言 1.结构光的原理和优点 结构光通过向待测物体表面投射光栅条纹图案来给物体增加特征信息,使得图像处理时,能够提取出更多的 ...

  4. 双目立体视觉源代码 双目立体视觉匹配程序 双目视觉3d成像(三维重构图像处理) 基于双目视觉的深度计算和三维重建 opencv写的双目视觉摄像机标定和三维重建代码

    双目视觉/双目标定源码/图片集标定匹配三维重建坐标计算OpenCV 1.双目立体视觉源代码(包括标定,匹配,三维重建) 2.双目视觉实验图片集(双目立体视觉中使用的标准实验图,适合初学者进 行实验使用 ...

  5. 一种基于OpenCV的三维重建实现方案

    一种基于OpenCV的三维重建实现方案 来源:淘金者论文范文 作者:Www.TaoJz.Com 日期:08/30/09 摘 要 本文以计算机视觉三维重建技术为研究对象,分析了开放计算机视觉函数库Ope ...

  6. Gesture recognition based on binocular vision(基于双目视觉的手势识别)

    基于双目视觉的手势识别 Gesture recognition based on binocular vision 原文见:https://link.springer.com/article/10.1 ...

  7. 基于MVS的三维重建算法学习笔记(二)— 立体视觉的几何基础总结

    基于MVS的三维重建算法学习笔记(二)- 立体视觉的几何基础总结 声明 概述 1. 常见三维数据类型 2. 三维形状的几种表达形式 3. 三维空间刚体运动 4. 李群和李代数 5. 相机标定 6. 非 ...

  8. 基于OpenCV做“三维重建”(1)--找到并绘制棋盘

        <OpenCV计算机视觉编程攻略(第3版)>这套书已经出到第3版了,如果你非要我说这本书有多好,我说不出来:只是很多我第一手的例子都是来源于这本书的-相比较OpenCV官方提供的代 ...

  9. 基于图像的三维重建——基于空间patch扩散的方法(PMVS)

    1.PMVS:多视图匹配经典算法简介 导语:常见的稠密重建方法主要有三种:基于体素的方法.基于深度图融合的方法以及基于3D patch扩张的方法.第一种基于体素的方法仅适用于小场景,单个物体,遮挡较少 ...

最新文章

  1. 前端开发进阶手册.pdf
  2. Windows Server 2008 R2 SP1遗忘管理员密码后的解决方案
  3. Photoshop剪切板故障修复
  4. 支付宝二面:Mybatis 接口 Mapper 内的方法为啥不能重载吗?我直接懵逼了。。。
  5. 深度学习 之 数据增广(包含源码及注释文件更改)
  6. 用友U8配置动态密码认证
  7. Martix工作室考核题 —— 打印一个菱形
  8. UVa OJ 120
  9. .NET Core玩转机器学习
  10. 【JAVA SE】第五章 数组、多维数组和Arrays类
  11. linux下查看mysql数据库的字段类型_系统运维|[小白技巧]如何在Linux上检查MySQL数据表的存储引擎类型...
  12. [Angularjs]视图和路由(一)
  13. java多线程访问beans对象_java-多线程同时操作同一个对象之解决方法:读写锁ReadWriteLock的使用...
  14. 全网最详细的hive-site.xml配置文件里如何添加达到Hive与HBase的集成,即Hive通过这些参数去连接HBase(图文详解)...
  15. 微信小程序 授权登录功能实现
  16. 【网络通信 -- 直播】SRS 实战记录 -- 开源流媒体服务器对比与 SRS 直播效果测试
  17. python中的def是什么意思啊_python的def是什么意思
  18. 汽车诊断协议:K线/CAN线、kwp2000、ISO14230、ISO1575、SAEJ1939
  19. Android使用FFmpeg 解码H264并播放(二)
  20. 手机测试软件对手机有影响吗,智能手机测试软件的猫腻

热门文章

  1. JVM - 结合代码示例彻底搞懂Java内存区域_对象在堆-栈-方法区(元空间)之间的关系
  2. Java-Java I/O 字节流之BufferedReader/BufferedWriter
  3. Java-Java I/O流解读之基于字符的I / O和字符流
  4. l麒麟安装oracle,中标麒麟5.8x64下64bitOracle11gR2安装配置手册.docx
  5. 超详细C语言的字符串函数讲解
  6. java4_Java 4
  7. ssm_maven idea分模块开发
  8. linux 统计根目录下的文件日期和出现的频率
  9. 攻防世界php2_攻防世界-web2
  10. java 大顶堆_107-大顶堆和小顶堆图解说明