最近在做TOF相机相关的软件,近年来tof相机开始在手机,车载设备,VR等应用开始增多,产业也开始量化,是一个不错的3维相机的方向。
简单介绍一下tof相机吧:TOF是Time of flight的简写,直译为飞行时间的意思。所谓飞行时间法3D成像,是通过给目标连续发送光脉冲,然后用传感器接收从物体返回的光,通过探测光脉冲的飞行(往返)时间来得到目标物距离。
具体原理介绍参考:http://www.eetrend.com/node/100074440
https://www.sohu.com/a/151732989_385809
http://www.cnblogs.com/Jessica-jie/p/6596450.html
tof相机又有单tof和RGB_D的分别,就是有只输出深度信息tof和输出三色图+深度数据的tof。反应到软件上深度信息其是一张二维的深度点云信息,也就是原始得到的信息是一张图像,每个点的值代表着相机和物体的距离的值,而不像二维相机是像素值。
tof相机原始深度数据到我们需要的3维点云数据的步骤:
1.对原始深度数据做初步校正和温度校准(tof相机的数据和相机的温度有关,这也是数据精度不高的一个原因)
2.图像的畸变校正。
3.深度图像坐标系(x0,y0,z0)转化成相机坐标系(x1,y1,z1),及把图像上的深度信息转化成以相机为原点的三维坐标系。
(没找到合适的参考资料,这个是介绍相机成像原理的,理论是一样的:https://blog.csdn.net/sunshine_zoe/article/details/73457686)
4.相机坐标系(x1,y1,z1)转化成需要的世界坐标系(x2,y2,z2),及把相机的坐标系转化成项目需要的坐标系,也就是最终的点云的坐标系。
一般用到对坐标系进行旋转,缩放和平移,一般用矩阵的运算求,对于(x1,y1,z1)可以放入一个【4*1】的矩阵中,变换矩阵是一个【4*4】的方阵
(1)平移:原始矩阵左乘一个变换矩阵,其中x,y,z是原始矩阵,x',y',z'是结果
(2)缩放:
用上面的变换矩阵左乘原始矩阵(x1,y1,z1)的【4*1】矩阵即可。
(3)旋转
参考这个博主的,写的很简明易懂:https://blog.csdn.net/swety_gxy/article/details/73087848
从图像坐标x0,y0,z0到相机坐标系x1,y1,z1,再转换到世界坐标系x2,y2,z2,第一个转换用标准的转换公式,第二个转换用旋转矩阵变化,包括相机的旋转和平移。
代码上可以写成如下的数学公式模型:
这样就能得到最终需要的点云数据,可以用python的pylotly进行可视化。
python代码:
import plotly.plotly as py
import plotly.graph_objs as go
import numpy as np
x, y, z = np.random.multivariate_normal(np.array([0,0,0]), np.eye(3), 200).transpose()
trace1 = go.Scatter3d(
x=x,
y=y,
z=z,
mode='markers',
marker=dict(
size=12,
line=dict(
color='rgba(217, 217, 217, 0.14)',
width=0.5
),
opacity=0.8
)
)
x2, y2, z2 = np.random.multivariate_normal(np.array([0,0,0]), np.eye(3), 200).transpose()
trace2 = go.Scatter3d(
x=x2,
y=y2,
z=z2,
mode='markers',
marker=dict(
color='rgb(127, 127, 127)',
size=12,
symbol='circle',
line=dict(
color='rgb(204, 204, 204)',
width=1
),
opacity=0.9
)
)
data = [trace1, trace2]
layout = go.Layout(
margin=dict(
l=0,
r=0,
b=0,
t=0
)
)
fig = go.Figure(data=data, layout=layout)
py.iplot(fig, filename='simple-3d-scatter')
使用plotly库的官网3d点云参考:https://plot.ly/python/3d-scatter-plots/
因本人水平有限,如果有哪里错误,希望大神指教。