介绍
深度图和点云是两种存储3D测量结果的常见数据形式。深度图保存了场景中的点沿成像光轴Z向的距离分量,而点云图保存了XYZ三个方向的全部信息,两种直接存在一定的转换关系。本文介绍如何将深度图正确的转换为点云。
所需参数
1. 获取相机内参
由于深度图仅保存了Z轴距离,要正确转换为点云,必须需要知道XY方向的信息,这些信息需要通过查询相机内参得到。内参由相机标定获得,而3D相机出厂都是经过标定的,SDK通常都提供了获取相机内参的接口。内参包含相机的主点 c x , c y c_x,c_y cx,cy,焦距 f x , f y f_x,f_y fx,fy,有时还包括相机的图像分辨率 W × H W\times H W×H,以及畸变参数。当无法获得相机内参的时候,事情就比较麻烦了,虽然可以自行对相机进行标定,但获取的内参与相机内部计算深度的内参难免存在差异,导致后续点云转换存在误差。
2. 处理畸变
原理上,双目和单目结构光计算深度需要经过去畸变、极线校正、图片匹配的过程,得到的深度图是不包含畸变的。而ITOF相机,深度图是否有畸变则取决于相机厂商的设置。
如果深度图包含畸变,则需要根据内参中的畸变模型和畸变参数,对畸变进行处理。最常用的畸变模型是Brown模型,畸变参数为表征径向畸变的 k 1 , k 2 , k 3 k_1,k_2,k_3 k1,k2,k3和表征切向畸变的 p 1 , p 2 p_1,p_2 p1,p2,如果是鱼眼镜头,使用的可能是KB模型,畸变参数为 k 1 , k 2 , k 3 , k 4 k_1,k_2,k_3,k_4 k1,k2,k3,k4。两种模型的去畸变方法可以参考博客【相机畸变:Brown-Conrady、Kanala-Brandt畸变模型与迭代去畸变】。
3.尺度
最后一步则是要搞清楚深度图的灰度尺度,即深度图中的1个灰度,对于现实世界的多少尺寸。具体的比例系数取决于设备厂商的设置,常见的是1mm/DN,即1数字灰度等于现实世界的1mm。
转换流程
1. 计算归一化平面的坐标 ( x , y ) (x,y) (x,y)
x = ( u − c x ) / f x y = ( v − c y ) / f y x = (u-c_x)/f_x\\y = (v-c_y)/f_y x=(u−cx)/fxy=(v−cy)/fy其中, u , v u,v u,v分别是像素的水平和竖直方向像素坐标, u ∈ [ 0 , W − 1 ] , v ∈ [ 0 , H − 1 ] u\in[0,W-1],v\in [0,H-1] u∈[0,W−1],v∈[0,H−1],W和H分别为图像宽度和高度。
2. 去畸变
x , y = undistort ( x , y ) x,y = \text{undistort}(x,y) x,y=undistort(x,y)详细参考博客【相机畸变:Brown-Conrady、Kanala-Brandt畸变模型与迭代去畸变】。文章来源:https://www.toymoban.com/news/detail-794444.html
3. 计算点云坐标 ( X , Y , Z ) (X,Y,Z) (X,Y,Z)
X = x ⋅ Depth ⋅ Scale Y = y ⋅ Depth ⋅ Scale Z = Depth ⋅ Scale X = x\cdot \text{Depth} \cdot \text{Scale}\\Y = y\cdot \text{Depth} \cdot \text{Scale}\\Z = \text{Depth}\cdot\text{Scale} X=x⋅Depth⋅ScaleY=y⋅Depth⋅ScaleZ=Depth⋅Scale其中,Depth为深度,Scale为深度尺度。文章来源地址https://www.toymoban.com/news/detail-794444.html
到了这里,关于【深度如何正确地转换为点云】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!