博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
3D点云图实验
阅读量:2172 次
发布时间:2019-05-01

本文共 2168 字,大约阅读时间需要 7 分钟。

视觉 3D 点云图构建与深度测量

    环境为linux系统,使用opencv处理图像,将五张不同角度和距离的图片和五张对应的深度图处理为点云图。关键是理解世界相机坐标系到世界坐标系的映射。相机拍出来的图片是以相机为中心的坐标系,确定一个世界坐标系,相机相对世界坐标系有一个姿态,然后可以将五张图中的像素点根据深度图可以算出各个像素点在相机坐标系中的3D位置,然后根据坐标系的转换关系,将像素点的位置转换到世界坐标系中,显示出来,就形成了3D点云图。资料在我的资源中

一、对各步骤调用函数API的理解

1、boost::format fmt("./%s/%d.%s" );

图像文件格式--定义遍历图片name的字符串    

2、colorImgs.push_back(cv::imread( (fmt%"color"%(i+1)%"png").str() ));

depthImgs.push_back( cv::imread((fmt%"depth"%(i+1)%"pgm").str(), -1 ));

将普通RGB图像和对应的深度图像读入,其中深度图像使用-1读取原始图像,深度图像经过坐标转换可以计算为点云数据,有规则及必要信息的点云数据也可以反算为深度图像数据。

3、Eigen::Quaterniond q(data[6], data[3], data[4], data[5] );

double类型四元数 (w,x,y,z) xyz是虚部,w是实部,四元数是一种高阶复数,相当于四维空间向量,其中三个虚数对应三维空间的三个维度,实数代表第四维,四元数可以绕任意轴旋转。

4、Eigen::Isometry3d T(q);

将四元数转化为四维齐次坐标系矩阵。用来对相机坐标系中的向量绕着一个轴进行旋转。

5、T.pretranslate(Eigen::Vector3d( data[0], data[1], data[2] ));

把坐标系矩阵按照相机外参中的平移向量进行平移。相机坐标系中的点经过旋转和平移就可以对应到世界坐标系统,旋转在后边每个像素点遍历时通过矩阵与向量相乘完成。

6、计算点云并拼接

  double cx = 325.5;  分辨率

  double cy = 253.5;

  double fx = 518.0;  焦距

  double fy = 519.0;

  double depthScale = 1000.0; 深度的单位

  相机内参

  typedef pcl::PointXYZRGB PointT;

  typedef pcl::PointCloud<PointT> PointCloud;

  PointCloud::Ptr pointCloud( new PointCloud );

定义点云使用的格式:这里用的是XYZRGB,新建一个点云

7、point[2] =double(d)/depthScale;

  point[0] = (u-cx)*point[2]/fx;

  point[1] = (v-cy)*point[2]/fy;

   根据相机成像相似三角形的原理公式来计算像素点在相机坐标系中的x、y、z的三维坐标。

8、Eigen::Vector3d pointWorld =T*point;

  将相机的齐次坐标与点在相机坐标系中的x、y、z坐标相乘,转换每个像素点在相机坐标系中的坐标到世界坐标系中的坐标。

9、PointT p ;

   p.x = pointWorld[0];

   p.y = pointWorld[1];

   p.z = pointWorld[2];

   p.b = color.data[ v*color.step+u*color.channels() ];

   p.g = color.data[ v*color.step+u*color.channels()+1 ];

p.r =color.data[ v*color.step+u*color.channels()+2 ];

将点的参数保存到point中,参数分别为像素点在世界坐标系中的x、y、z坐标和像素点的blue、green、red。将所有点都转化完之后,就得到了所有的照片中所有有效像素点在同一个世界坐标系中的位置和颜色信息,也就可以生成立体的点云图。

10、pcl::io::savePCDFileBinary("map.pcd",*pointCloud );

将点云数据保存到pcd文件中

 

二、单目双目相机参数矩阵的含义

1、单目相机参数矩阵

内参是相机的固有属性,比如相机x和y方向的焦距,相机的分辨率。

单目相机外参有七个参数,其中包括四元数四个参数和三个参数的平移向量。其中四个参数为四元数,表示相机坐标系中的点相对于世界坐标系的旋转角度,三个参数是平移向量,表示相机坐标系中点相对于世界坐标系的偏移,相机坐标系中的点先由小孔成像的原理使用相似三角形将相片中像素点计算到相机坐标系空间中,然后通过平移和旋转对应到世界坐标系中。这样通过五张照片不同的相机姿态对应到相同的的世界坐标系中,形成一个点云图。

2、双目相机参数

   双目相机的内参与单目一样,关键是外参,双目两个镜头之间的坐标系的相互对应关系需要可以通过平移矩阵T和旋转旋转矩阵R来描述。

 

 

转载地址:http://xqhzb.baihongyu.com/

你可能感兴趣的文章
【LEETCODE】20-Valid Parentheses
查看>>
【LEETCODE】290-Word Pattern
查看>>
【LEETCODE】36-Valid Sudoku
查看>>
【LEETCODE】205-Isomorphic Strings
查看>>
【LEETCODE】204-Count Primes
查看>>
【LEETCODE】228-Summary Ranges
查看>>
【LEETCODE】27-Remove Element
查看>>
【LEETCODE】66-Plus One
查看>>
【LEETCODE】26-Remove Duplicates from Sorted Array
查看>>
【LEETCODE】118-Pascal's Triangle
查看>>
【LEETCODE】119-Pascal's Triangle II
查看>>
【LEETCODE】88-Merge Sorted Array
查看>>
【LEETCODE】19-Remove Nth Node From End of List
查看>>
【LEETCODE】125-Valid Palindrome
查看>>
【LEETCODE】28-Implement strStr()
查看>>
【LEETCODE】6-ZigZag Conversion
查看>>
【LEETCODE】8-String to Integer (atoi)
查看>>
【LEETCODE】14-Longest Common Prefix
查看>>
【LEETCODE】38-Count and Say
查看>>
【LEETCODE】278-First Bad Version
查看>>