用VS+Opencv3.1从双目立体视差图中重建三维点云
来源:互联网 发布:可以画画的软件 编辑:程序博客网 时间:2024/06/11 20:11
基本原理
详细原理请阅读这篇文章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> usingnamespace cv;usingnamespacestd;usingnamespace pcl; int user_data;//相机内参,根据输入改动constdouble u0 = 1329.49 / 4;//由于后面resize成原图的1/4所以有些参数要缩小相同倍数constdouble v0 = 954.485 / 4;constdouble fx = 6872.874 / 4;constdouble fy = 6872.874 / 4;constdouble Tx = 174.724;constdouble doffs = 293.97 / 4; void viewerOneOff(visualization::PCLVisualizer& viewer){ viewer.setBackgroundColor(0.0, 0.0, 0.0);} int main(){ PointCloud<PointXYZRGB>cloud_a; PointCloud<PointXYZRGB>::Ptr cloud(new PointCloud<PointXYZRGB>); Mat color1 = imread("im0.png"); Mat depth = imread("Sword1_perfect_d.png"); ////Resize //color1.resize(); Mat color; resize(color1, color,Size(color1.cols/4,color1.rows/4), 0, 0,CV_INTER_LINEAR); //imshow("h",color); //waitKey(0); int rowNumber = color.rows; int colNumber = color.cols; cloud_a.height = rowNumber; cloud_a.width = colNumber; cloud_a.points.resize(cloud_a.width * cloud_a.height); for (unsignedint u = 0; u < rowNumber; ++u) { for (unsignedint v = 0; v < colNumber; ++v) { /*unsigned intnum = rowNumber*colNumber-(u*colNumber + v)-1;*/ unsignedint num = u*colNumber + v; double Xw = 0, Yw = 0, Zw = 0; Zw = fx*Tx / (((double)depth.at<Vec3b>(u, v)[0]) + doffs); Xw = (v+1 - u0) * Zw / fx; Yw = (u+1 - v0) * Zw / fy; cloud_a.points[num].b =color.at<Vec3b>(u, v)[0]; cloud_a.points[num].g =color.at<Vec3b>(u, v)[1]; cloud_a.points[num].r =color.at<Vec3b>(u, v)[2]; cloud_a.points[num].x =Xw; cloud_a.points[num].y =Yw; cloud_a.points[num].z =Zw; } } *cloud = cloud_a; visualization::CloudViewerviewer("Cloud Viewer"); viewer.showCloud(cloud); viewer.runOnVisualizationThreadOnce(viewerOneOff); while (!viewer.wasStopped()) { user_data = 9; } return0;}
效果图
输入:
“im0.png”可以从http://vision.middlebury.edu/stereo/data/scenes2014/datasets/Sword1-perfect/im0.png 下载;
“Sword1_perfect_d.png”
输出:
点云截图1
点云截图2
0 0
- 用VS+Opencv3.1从双目立体视差图中重建三维点云
- 用VS+Opencv3.1从双目立体视差图中重建三维点云
- 双目立体视差图计算
- 视差计算-双目立体校正
- 【立体视觉】双目测距,生成视差图/深度图
- OPENCV3.0 双目立体标定
- OPENCV3.0 双目立体标定
- OPENCV3.0 双目立体标定
- OpenGL OpenCV根据视差图重建三维信息
- vtk三维点云重建vtkSurfaceConstructionFilter
- 基于立体视觉的三维图像重建
- 【双目视觉探索路3】分析整理Learning OpenCV3书中立体标定、校正以及对应代码(1)之总体
- Meshlab读取三维点云、三维点云重建以及三维点云法向量计算
- 基于双目立体视觉的物体三维尺寸测量
- Binocular Disparity map 双目视差图
- 双目+rtabmap_ros三维建图
- 双目测距与三维重建的OpenCV实现问题集锦(三)立体匹配与视差计算
- 三维栅格地图构建之二:视差图及点云图
- 为什么要做服务化?
- 顺时针打印数组
- 【LeetCode】Maximum Subarray 解题报告
- 实现简单的信息查询系统(分页和Servlet的运用)
- CSS常用布局之——一列定宽,一列自适应解决方案
- 用VS+Opencv3.1从双目立体视差图中重建三维点云
- C++异常捕捉两种情况-产生前-外层函数中
- Linux信号量sem_t简单实例运用
- Python项目使用memcached缓存
- 关于查询的作业题
- Flask进阶(一)——请求上下文和应用上下文完全解答(上)
- Medium:Find Bottom Left Tree Value
- 实现分页代码
- Java连接数据库步骤