intrinsic_matrix = np.array([[707.0912, 0, 601.8873], [0, 707.0912, 183.1104], [0, 0, 1]])

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)的矩阵,该矩阵用于将三维世界坐标转换为相机的二维图像坐标。内部矩阵包含了有关相机透镜和图像传感器的特定信息,例如焦距和光学中心。

具体地说,该内部矩阵的组成如下:

  • 第一行的第一个元素表示沿x轴的焦距,由图像宽度的一半除以50度视场角的正切的一半来计算。
  • 第二行的第二个元素表示沿y轴的焦距,与第一行的第一个元素计算方式相同。
  • 第三行是 [0, 0, 1],这是内部矩阵的标准格式。
  • 第一行和第二行的第三个元素表示图像的中心,即光学中心,这里分别是图像宽度和高度的一半。

如果您要使用KITTI数据集的已知内部参数矩阵,则应将该矩阵替换为KITTI特定的值。KITTI数据集通常会提供内部参数,所以您可以从数据集文档中找到它们。

假设KITTI的内部矩阵为:

fx = 已知的x轴焦距
fy = 已知的y轴焦距
cx = 已知的x轴光学中心
cy = 已知的y轴光学中心

KITTI数据集通常使用的左侧彩色相机的内部参数如下:

  • fx(x轴焦距):约为 718.8560
  • fy(y轴焦距):约为 718.8560
  • cx(x轴光学中心):约为 607.1928
  • cy(y轴光学中心):约为 185.2157

您可以使用以下代码将这些参数插入您的内部矩阵:

intrinsic_matrix = np.array([[718.8560, 0, 607.1928], [0, 718.8560, 185.2157], [0, 0, 1]])

你可能感兴趣的:(算法)