nuScenes数据集3dBox转换2dBox

文章目录

  • 前言
  • 一、主要函数
    • 1.从3d视角投影到2d平面(均为图像下)
    • 2.得到目标在图像视角下的2d坐标(坐上,右下)
  • 二、效果展示
  • 三、源码以及运行
    • 1.源码链接
    • 2.源码运行


前言

接续上篇文章nuScenes数据集3Dbounding box的更新,本篇文章主要讲解如何从图像的3dbox转到2dbox(内附源码)

注意:在nuScenes源码文件下有一个get_2d_annotation_as_json.py,运行之后可以直接得到2d注释信息,但是小编在运行得到后,发现会有遗漏,也就是多个相机下的sanples数量不等。因此加以改进得到所有的注释信息。

一、主要函数

1.从3d视角投影到2d平面(均为图像下)

代码如下:

def view_points(points: np.ndarray, view: np.ndarray, normalize: bool) -> np.ndarray:
# points就是我们的3d框的8个角坐标;view就是我们所需要用到对应相机的相机内参。
    assert view.shape[0] <= 4
    assert view.shape[1] <= 4
    assert points.shape[0] == 3

    viewpad = np.eye(4)
    viewpad[:view.shape[0], :view.shape[1]] = view

    nbr_points = points.shape[1]

    points = np.concatenate((points, np.ones((1, nbr_points))))
    points = np.dot(viewpad, points)
    points = points[:3, :]

    if normalize:
        points = points / points[2:3, :].repeat(3, 0).reshape(3, nbr_points)

    return points

2.得到目标在图像视角下的2d坐标(坐上,右下)

def post_process_coords(corner_coords: List,
                        imsize: Tuple[int, int] = (1600, 900)) -> Union[Tuple[float, float, float, float], None]:
    polygon_from_2d_box = MultiPoint(corner_coords).convex_hull  # 多边形
    img_canvas = box(0, 0, imsize[0], imsize[1])  # 图像的画布 box(minx,miny,maxx,maxy)左上右下

    if polygon_from_2d_box.intersects(img_canvas):  # 如果相交
        img_intersection = polygon_from_2d_box.intersection(img_canvas)
        intersection_coords = np.array([coord for coord in img_intersection.exterior.coords])

        min_x = min(intersection_coords[:, 0])
        min_y = min(intersection_coords[:, 1])
        max_x = max(intersection_coords[:, 0])
        max_y = max(intersection_coords[:, 1])

        return min_x, min_y, max_x, max_y
    else:
        return None

二、效果展示

在生成2dbox的时候,加入了id信息。

nuScenes数据集3dBox转换2dBox_第1张图片
nuScenes数据集3dBox转换2dBox_第2张图片
从上面相连的两帧可以看出,同一个物体的id号是没有改变的,可以很好的应用到数据集的检测、跟踪过程。

放一个场景下的一段GIF图:

从这里可以更清楚的看到一个scene下,目标的id是始终保持一致的。

三、源码以及运行

1.源码链接

源码链接

2.源码运行

获取源码后,需要更改dataroot,确保数据集的路径准确。在pycharm上直接运行draw_2d_box.py即可;另外一个py文件是把同一场景下的6个摄像机的图片放在一起。

你可能感兴趣的:(nuScenes,python,计算机视觉,pytorch)