[关闭]
@iStarLee 2019-03-30T14:45:25.000000Z 字数 2708 阅读 385

第5讲 相机与图像

视觉slam14讲


1 相机模型

相机模型是用来描述将三维世界坐标系中的坐标点映射到二维图像平面的过程
使用针孔和畸变两个模型来描述整个投影过程。

1.1 针孔相机模型

(1) 相机坐标系内中物理坐标点,
(2) 成像平面内成像坐标点, 焦距为,
通过对称成像平面和归一化成像平面得到二者关系为


(3) 像素坐标系内像素坐标为,像素坐标系和成像平面相差了一个缩放()和一个原点的平移
和像素坐标关系为

代入上式得到像素坐标和相机坐标系内点的关系

其中,

齐次化写成矩阵形式,
按照传统习惯将挪到左侧,表达的就是相机坐标系中点和像素坐标系中像素的关系

把中间量称作相机内参。

相机坐标是由它的世界坐标变换而来,相机位姿由决定。那么有下式成立,

最后一个式子里面隐含着一次齐次坐标到非齐次坐标的转换(的最后一维是1),也就是

两边除以, 所以,

其中称为归一化坐标,二维的齐次坐标,它位于相机前方的平面上,叫做归一化平面
其实到现在才理解了什么是归一化平面,这个平面其实是相机坐标系下的一个平面,利用3d点除以z得到的平面。

变换过程总结:
世界坐标系下点相机坐标归一化相机坐标像素坐标

1.2 畸变

一般使用的去畸变处理方法:先对整张图像去畸变,得到去畸变后的图像,然后讨论图像上点的空间位置。

1.3 双目相机模型

为焦距,为左右光圈中心,为成像平面坐标,为双目的基线,是物体点距离双目基线的距离,为视差(disparity)

根据三角形相似得到


整理得到

可见双目的深度受限于,另外视差的计算比较困难,只有在图像纹理变化丰富的地方才能计算视差。

1.4 RGBD相机模型

原理

2 图像的存储和访问

2.1 图像的宽度和高度

一张宽度为,高度为像素的分辨率灰度图(0~255)表示为

  1. //unsigned char image[h][w]
  2. unsigned char image[480][640]

传统像素坐标系为轴向右,轴向下,轴向前(里)

  1. unsigned char image[y][x]

也就是

数组的行数高度
数组的列数宽度

2.2 图像的通道

彩色图像需要使用通道(channel)来表示,常见有3个通道,每个通道有8位整数表示,这样的话一个像素占24位空间。

3 点云拼接

  1. //1. 获取真实深度d,由像素坐标u,v求出归一化平面上坐标X,Y(相机坐标系)
  2. Eigen::Vector3d point;
  3. point[2] = double(d)/depthScale;
  4. point[0] = (u-cx)*point[2]/fx;
  5. point[1] = (v-cy)*point[2]/fy;
  6. //2. 将相机坐标系下的点转到世界坐标系下
  7. Eigen::Vector3d pointWorld = T_w_c*point;
  8. //3. 3D点赋值(RGB和XYZ)
  9. PointT p ;
  10. p.x = pointWorld[0];
  11. p.y = pointWorld[1];
  12. p.z = pointWorld[2];
  13. p.b = color.at<cv::Vec3b>(v,u)(0);
  14. p.g = color.at<cv::Vec3b>(v,u)(1);
  15. p.r = color.at<cv::Vec3b>(v,u)(2);
  16. //4. 3D点加入点云中
  17. pointCloud->points.push_back( p );
  18. //5. 保存点云
  19. pcl::io::savePCDFileBinary("map.pcd", *pointCloud );
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注