@iStarLee
2019-03-30T14:45:25.000000Z
字数 2708
阅读 393
视觉slam14讲
相机模型是用来描述将三维世界坐标系中的坐标点映射到二维图像平面的过程
使用针孔和畸变两个模型来描述整个投影过程。
(1) 相机坐标系内中物理坐标点,
(2) 成像平面内成像坐标点, 焦距为,
通过对称成像平面和归一化成像平面得到二者关系为
变换过程总结:
世界坐标系下点相机坐标归一化相机坐标像素坐标
一般使用的去畸变处理方法:先对整张图像去畸变,得到去畸变后的图像,然后讨论图像上点的空间位置。
为焦距,为左右光圈中心,为成像平面坐标,为双目的基线,是物体点距离双目基线的距离,为视差(disparity)
根据三角形相似得到
可见双目的深度受限于,另外视差的计算比较困难,只有在图像纹理变化丰富的地方才能计算视差。
原理
一张宽度为,高度为像素的分辨率灰度图(0~255)表示为
//unsigned char image[h][w]
unsigned char image[480][640]
传统像素坐标系为轴向右,轴向下,轴向前(里)
unsigned char image[y][x]
也就是
数组的行数高度轴
数组的列数宽度轴
彩色图像需要使用通道(channel)来表示,常见有3个通道,每个通道有8位整数表示,这样的话一个像素占24位空间。
//1. 获取真实深度d,由像素坐标u,v求出归一化平面上坐标X,Y(相机坐标系)
Eigen::Vector3d point;
point[2] = double(d)/depthScale;
point[0] = (u-cx)*point[2]/fx;
point[1] = (v-cy)*point[2]/fy;
//2. 将相机坐标系下的点转到世界坐标系下
Eigen::Vector3d pointWorld = T_w_c*point;
//3. 3D点赋值(RGB和XYZ)
PointT p ;
p.x = pointWorld[0];
p.y = pointWorld[1];
p.z = pointWorld[2];
p.b = color.at<cv::Vec3b>(v,u)(0);
p.g = color.at<cv::Vec3b>(v,u)(1);
p.r = color.at<cv::Vec3b>(v,u)(2);
//4. 3D点加入点云中
pointCloud->points.push_back( p );
//5. 保存点云
pcl::io::savePCDFileBinary("map.pcd", *pointCloud );