深度图转点云的计算方法不复杂,是根据内外参矩阵变换公式获得的。spa
一个相机的三维点[x,y,z]和它在图像中的像素坐标[u,v,d],存在着一个固定的对应关系(对于小孔成像的相机原理的相机)code
上述的公式是从世界坐标获得图像中像素坐标,同理也可从从图像的像素坐标转换到世界坐标下。blog
根据这个公式能够对点云进行构建。class
若是相机发生了位移和旋转,那么只须要对这些点进行相应的处理便可。(通常相机在0时刻是与世界坐标重合的)原理
对于深度图中的点,转换成三维坐标在程序中通常是以下这样的:程序
for (int m = 0; m < depth.rows; m++) for (int n=0; n < depth.cols; n++) { // 获取深度图中(m,n)处的值 ushort d = depth.ptr<ushort>(m)[n]; // d 可能没有值,若如此,跳过此点 if (d == 0) continue; // d 存在值,则向点云增长一个点 PointT p; // 计算这个点的空间坐标 p.z = double(d) / camera_factor; p.x = (n - camera_cx) * p.z / camera_fx; p.y = (m - camera_cy) * p.z / camera_fy; }
点云也能够加入颜色,如有RGB图也是能够的。(这里要注意深度没有值的时候,在应用的时候的具体状况,是否须要在这种状况下具体处理)