写python代码,利用open3d,在bin文件的激光雷达点云数据中,利用真值label的txt文件构建矩形框,并输出图像。每个txt文件对应多辆车辆的标签信息,txt文件数据格式:Car 0.00 0 -1.12 -1 -1 -1 -1 2.21 2.63 4.97 3.10 2.13 -7.78 -1.50等等,其中包含以下信息:1.车辆类型,如"car", "van", "bus"等。2.车辆被裁剪的比例,范围为[0,1],表示车辆是否完全在图像内部。如果为0则表示车辆完全在图像内部,如果为1则表示车辆完全在图像外部。 3.车辆被遮挡的比例,范围为[0,1],表示车辆被遮挡的程度。如果为0则表示车辆没有被遮挡,如果为1则表示车辆完全被遮挡。 4.车辆朝向的旋转角度,范围为[-pi,pi],表示车辆的朝向与图像的x轴之间的夹角。 5.车辆在图像中的2D边界框,格式为(x_min,y_min,x_max,y_max),表示左上角和右下角的坐标。6. 车辆在3D空间中的边界框,格式为(h, w, l, x, y, z, yaw),表示边界框的长宽高和中心点坐标以及朝向角度。其中,h表示高度,w表示宽度,l表示长度,(x,y,z)表示中心点的坐标,yaw表示朝向角度。
时间: 2023-07-14 20:12:29 浏览: 92
在KITTI数据集中利用GroundTruth文件拼接pcd点云并滤波
以下是一个示例代码,可以读取bin文件和对应的txt文件,并在点云中绘制矩形框,并输出图像。
```python
import open3d as o3d
import numpy as np
# 读取bin文件,返回点云数据
def read_bin(pcd_file):
with open(pcd_file, "rb") as f:
byte = f.read(4)
data = []
while byte:
x = np.frombuffer(byte, dtype=np.float32)[0]
y = np.frombuffer(f.read(4), dtype=np.float32)[0]
z = np.frombuffer(f.read(4), dtype=np.float32)[0]
i = np.frombuffer(f.read(4), dtype=np.float32)[0]
data.append([x, y, z])
byte = f.read(4)
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(np.array(data))
return pcd
# 读取txt文件,返回标签数据
def read_label(label_file):
with open(label_file, 'r') as f:
lines = f.readlines()
labels = []
for line in lines:
label = {}
items = line.split(' ')
label['type'] = items[0]
label['truncated'] = float(items[1])
label['occluded'] = int(items[2])
label['alpha'] = float(items[3])
label['bbox'] = [float(items[4]), float(items[5]), float(items[6]), float(items[7])]
label['dimensions'] = [float(items[8]), float(items[9]), float(items[10])]
label['location'] = [float(items[11]), float(items[12]), float(items[13])]
label['rotation_y'] = float(items[14])
labels.append(label)
return labels
# 绘制矩形框
def draw_bounding_box(pcd, label):
corners = get_box_corners(label)
lines = [[0,1],[1,2],[2,3],[3,0],[4,5],[5,6],[6,7],[7,4],[0,4],[1,5],[2,6],[3,7]]
colors = [[1, 0, 0] for i in range(len(lines))]
line_set = o3d.geometry.LineSet(points=o3d.utility.Vector3dVector(corners), lines=o3d.utility.Vector2iVector(lines))
line_set.colors = o3d.utility.Vector3dVector(colors)
pcd += line_set
return pcd
# 获取矩形框的8个顶点坐标
def get_box_corners(label):
h, w, l = label['dimensions']
x, y, z = label['location']
ry = label['rotation_y']
# 3D bounding box corners
corners = np.array([
[-l / 2, -h, -w / 2],
[l / 2, -h, -w / 2],
[l / 2, -h, w / 2],
[-l / 2, -h, w / 2],
[-l / 2, 0, -w / 2],
[l / 2, 0, -w / 2],
[l / 2, 0, w / 2],
[-l / 2, 0, w / 2]
])
# rotation
rot_mat = np.array([
[np.cos(ry), 0, np.sin(ry)],
[0, 1, 0],
[-np.sin(ry), 0, np.cos(ry)]
])
corners = corners @ rot_mat.T
# translation
corners += np.array([x, y, z])
return corners
# 主函数
if __name__ == '__main__':
pcd_file = 'example.bin'
label_file = 'example.txt'
pcd = read_bin(pcd_file)
labels = read_label(label_file)
for label in labels:
if label['type'] == 'car':
pcd = draw_bounding_box(pcd, label)
o3d.visualization.draw_geometries([pcd])
```
在该示例代码中,我们首先使用`read_bin`和`read_label`函数分别读取bin文件和txt文件,然后使用`draw_bounding_box`函数绘制矩形框,并将其添加到点云中。最后,我们使用`o3d.visualization.draw_geometries`函数显示点云并输出图像。需要注意的是,该示例代码仅支持绘制车辆类型为"car"的矩形框,如果需要绘制其他类型的矩形框,需要进行相应的修改。
阅读全文