- open3d其实有很多交互式命令,在运行程序打开了open3d渲染的窗口后,鼠标点击窗口,按H就会弹出,交互命令的帮助,如下图所示:
其中比较常用的有:
Q :退出当前窗口
H:打印帮助命令
P:对当前窗口进行截图,重点来了,按下P的时候,在你的工程目录下,会增加一个当前窗口的png图像以及对应的json相机参数。
其中ScreenCamera_2024-01-11-11-08-22.json的内容如下,包含当前视角相机的外参extrinsic,内参以及图像信息等等:
{
"class_name" : "PinholeCameraParameters",
"extrinsic" :
[
0.99946264692571185,
-8.6398302849258375e-05,
-0.032778192988375789,
0.0,
0.0054931702559795721,
-0.98541262313045108,
0.17009346623460431,
0.0,
-0.032314740920959963,
-0.1701821221823753,
-0.98488263402738219,
0.0,
0.016156891452814959,
0.085091532028104933,
17.120130331518144,
1.0
],
"intrinsic" :
{
"height" : 1080,
"intrinsic_matrix" :
[
935.30743608719376,
0.0,
0.0,
0.0,
935.30743608719376,
0.0,
959.5,
539.5,
1.0
],
"width" : 1920
},
"version_major" : 1,
"version_minor" : 0
}
Ctrl+C && Ctrl +V:调整视图视角后,Ctrl+C是拷贝了当前的相机视角状态,Ctrl + V复制粘贴到需要的地方就OK了,view status信息如下:
{
"class_name" : "ViewTrajectory",
"interval" : 29,
"is_loop" : false,
"trajectory" :
[
{
"boundingbox_max" : [ 6.0000009536743164, 6.0000009536743164, 2.0000000119209291 ],
"boundingbox_min" : [ -6.0, -6.0, -1.0 ],
"field_of_view" : 60.0,
"front" : [ 0.0, 0.0, 1.0 ],
"lookat" : [ 4.76837158203125e-07, 4.76837158203125e-07, 0.50000000596046457 ],
"up" : [ 0.0, 1.0, 0.0 ],
"zoom" : 0.69999999999999996
}
],
"version_major" : 1,
"version_minor" : 0
}
这里面的各个变量都是什么含义,以下是GPT3.5的回答,
2. 可视化报错
显示界面一闪而过,报错信息如下:
vis.add_geometry(voxels)
TypeError: add_geometry(): incompatible function arguments. The following argument types are supported:
1. (self: open3d.cpu.pybind.visualization.Visualizer, geometry: open3d.cpu.pybind.geometry.Geometry, reset_bounding_box: bool = True) -> bool
Invoked with: Visualizer with name Open3D, array([[-5.95, -5.95, -0.95],
[-5.95, -5.95, -0.85],
[-5.95, -5.95, -0.75],
...,
[ 5.95, 5.95, 4.75],
[ 5.95, 5.95, 4.85],
[ 5.95, 5.95, 4.95]])
原因及解决方案:
原因是因为vis.add_geometry(voxel)
直接添加的(33456,3)numpy array数组,这里add_geometry必须添加点云对象,open3d可以用以下代码把数组对象转换成点云对象:
pcd_voxel = o3d.geometry.PointCloud() #创建一个open3d的点云对象
pcd_voxel.points = o3d.utility.Vector3dVector(voxels)#Vector3dVector方法将voxels数组转换成点云对象的points
pcd_reconstruction = o3d.geometry.PointCloud()
pcd_reconstruction.points = o3d.utility.Vector3dVector(pcd_reconstruction_points)
vis = o3d.visualization.Visualizer()
vis.create_window()
vis.add_geometry(pcd_voxel)#此时就可以正常添加要可视化的对象
vis.add_geometry(pcd_reconstruction)
vis.run()
vis.destroy_window()
值得注意的一点是open3d显示的时候,单位是毫米,而雷达数据单位是米,一般标定的ego2lidar的RT外参单位也是毫米,所以再把点云数据读进来的时候,要乘以1000做一个单位的转换。
可视化结果从这样变成那样: