def calib_sensor(self):
"""
相机与LiDAR之间的校准函数。
1) 使用内部和外部矩阵,LiDAR边界框将投影到图像平面。
2) 投影后,计算iou。
如果至少一对的iou超过0.65,则保留边界框。
否则,边界框将被删除。
"""
# 内部矩阵定义
intrinsic_matrix = np.array([[(self.image.shape[1]//2)/math.tan(0.5*math.radians(50)), 0, (self.image.shape[1]//2)], [0, (self.image.shape[1]//2)/math.tan(0.5*math.radians(50)), (self.image.shape[0]//2)], [0, 0, 1]])
# 外部矩阵定义
extrinsic_matrix = np.array([[-0.1736, -0.9848, 0, -1.08], [0, 0, -1, -0.5], [0.9848, -0.1736, 0, 0.368]])
boxes = BoundingBoxArray() # 边界框数组初始化
boxes.header = self.lidar_header_info # 设置边界框头信息
cnt = 1 # 计数器初始化
self.remove_list = [] # 初始化移除列表
after_fusion_box_list = [] # 初始化融合后的边界框列表
for lidar_bbox in self.lidar_bbox_list: # 遍历LiDAR边界框列表
yaw = quaternion2euluer(lidar_bbox.pose.orientation.x, lidar_bbox.pose.orientation.y, lidar_bbox.pose.orientation.z, lidar_bbox.pose.orientation.w) # 获取偏航角
world_pts = self.bbox2globalBEV(lidar_bbox) # 将边界框转换为全球BEV
corner_pts = self.select_corners(lidar_bbox, world_pts) # 选择边界框角点
proj_x_pts = [] # 初始化投影的x坐标点
proj_y_pts = [] # 初始化投影的y坐标点
for corner in corner_pts: # 遍历角点
new_corner = np.array([[corner[0]], [corner[1]], [corner[2]], [1]]) # 创建新的角点
local_pt = intrinsic_matrix @ extrinsic_matrix @ new_corner # 计算局部点
scaling = local_pt[2][0] # 获取缩放因子
local_pt /= scaling # 应用缩放因子
proj_x_pts.append(round(local_pt[0][0])) # 添加投影的x坐标点
proj_y_pts.append(round(local_pt[1][0])) # 添加投影的y坐标点
# 计算边界框的最小和最大坐标
x_min = min(proj_x_pts)
y_min = min(proj_y_pts)
x_max = max(proj_x_pts)
y_max = max(proj_y_pts)
temp_bbox = [x_min, y_min, x_max, y_max] # 临时边界框定义
cnt += 1 # 计数器增加
# 在图像上绘制矩形
cv2.rectangle(self.image, (x_min, y_min), (x_max, y_max), (0, 255, 0), 5)
flag = 0 # 标志位初始化
for cam_bbox in self.cam_bbox_list: # 遍历相机边界框列表
if (iou(cam_bbox, temp_bbox) > 0.2): # 如果iou大于0.2
flag += 1 # 标志位增加
if flag != 0: # 如果标志位不为0
after_fusion_box_list.append(lidar_bbox) # 添加边界框到融合后的列表
boxes.boxes = after_fusion_box_list # 设置边界框
self.fusion_pub.publish(boxes) # 发布边界框
cv2.imshow('Display', self.image) # 显示图像
cv2.waitKey(1) # 等待按键
这段代码涉及到相机和LiDAR之间的校准,主要包括了LiDAR边界框投影到图像平面、计算IOU并保留或删除边界框等步骤。
该代码定义了一个称为内部矩阵(intrinsic matrix)的矩阵,该矩阵用于将三维世界坐标转换为相机的二维图像坐标。内部矩阵包含了有关相机透镜和图像传感器的特定信息,例如焦距和光学中心。
具体地说,该内部矩阵的组成如下:
[0, 0, 1]
,这是内部矩阵的标准格式。如果您要使用KITTI数据集的已知内部参数矩阵,则应将该矩阵替换为KITTI特定的值。KITTI数据集通常会提供内部参数,所以您可以从数据集文档中找到它们。
假设KITTI的内部矩阵为:
fx = 已知的x轴焦距
fy = 已知的y轴焦距
cx = 已知的x轴光学中心
cy = 已知的y轴光学中心
KITTI数据集通常使用的左侧彩色相机的内部参数如下:
您可以使用以下代码将这些参数插入您的内部矩阵:
intrinsic_matrix = np.array([[718.8560, 0, 607.1928], [0, 718.8560, 185.2157], [0, 0, 1]])