基于Win10+OpenCV3.4.1+PCL1.8环境,使用双目立体视差图进行三维点云的重建。
原理
使用双目视差图重建三维点云的原理其实很简单,与使用RGB-D相机进行三维点云重建的过程并没有太大区别,主要是通过双目立体视觉获取物体的深度信息( Z c Z_c Zc),并计算 X c 、 Y c X_c、Y_c Xc、Yc坐标值,配合原图提供的RGB信息,即可构成三维点云(PointXYZRGB)。
- 双目立体视觉获取视差图和深度图的原理可参考: 双目视觉测距原理深度剖析:一个被忽略的小问题
- 三维点云重建相关流程可参考:三维重建技术概述
代码
/*
相机参数:
cam0 = [4152.073 0 1288.147; 0 4152.073 973.571; 0 0 1]
cam1 = [4152.073 0 1501.231; 0 4152.073 973.571; 0 0 1]
doffs = 213.084
baseline = 176.252
width = 2872
height = 1984
相机内参数矩阵:
K=[fx 0 u0; 0 fy v0; 0 0 1]
doffs = |u1 - u0|
*/
#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 cv;
using namespace std;
using namespace pcl;
int user_data;
// 相机内参
const double u0 = 1288.147;
const double v0 = 973.571;
const double fx = 4152.073;
const double fy = 4152.073;
const double baseline = 176.252;
const double doffs = 213.084; // 代表两个相机主点在x方向上的差距, doffs = |u1 - u0|
void viewerOneOff(visualization::PCLVisualizer& viewer)
{
viewer.setBackgroundColor(0.0, 0.0, 0.0);
}
int main()
{
// 读入数据
Mat color = imread("im0.png"); // RGB
Mat depth = imread("disp0.png"