3D 对象定位到 2D 图像

3D object location to 2D image

提问人:wiswasi 提问时间:9/6/2023 更新时间:9/6/2023 访问量:69

问:

我正在使用ROS来记录CARLA Simulator的数据。我想在RGB前置摄像头图像上渲染一个与另一辆车的位置相对应的边界框。

下面是 bag 文件中的示例帧:enter image description here

假设我的自我车辆在当前图像中的位置是 (60, -65, 0.7),红色车辆的位置是 (45, -70, 0.8),比例是 (4, 2, 1)。根据我对图形数学的理解,我想出了以下代码,但我不知道 CARLA 相机的焦距或主点。

// Camera intrinsic parameters (calibration)
double focal_length_x = ...;
double focal_length_y = ...;
double principal_point_x = ...;
double principal_point_y = ...;

// Vehicle's world position
Vector3d vehicle_position_world(45, -70, 0.8);

// Camera's world position
Vector3d camera_position_world(60, -65, 0.7);

// Calculate the relative position of the vehicle to the camera
Vector3d relative_position = vehicle_position_world - camera_position_world;

// Calculate 2D camera coordinates using the projection formula
double camera_x = (relative_position.x() / relative_position.z()) * focal_length_x + principal_point_x;
double camera_y = (relative_position.y() / relative_position.z()) * focal_length_y + principal_point_y;

有人可以帮我正确的转换方法并获得边界框的准确位置吗?

谢谢!

C++ 数学 矩阵 图形 3D

评论


答:

0赞 Spektre 9/6/2023 #1

首先:我们没有关于您的坐标系、单位和您参考的相机的信息,因此无法在特定的温度中回答......您应该添加描述这些的图像以及相机信息,例如每个轴的 FOV、相机分辨率、芯片、传感器尺寸......

如果您知道您的相机,那么除了它的分辨率外,您还可以计算焦距,以便您可以在任何屏幕 2D 位置投射 3D 光线FOVx,FOVyxs,ys

FOVx = 2*tan(xs/(2*focal_length))
FOVy = 2*tan(ys/(2*focal_length))

focal_length = xs/(2*atan(FOVx/2))
focal_length = ys/(2*atan(FOVy/2))

如果您还有深度信息,则可以计算每个像素相对于相机的 3D 位置。

如果你不这样做,你可以假设道路是“平坦的地面”,如果你知道你的相机相对于地面的位置,你可以计算每个道路像素(3D位置)的距离,所以只要找到与道路像素相邻的目标像素,你就有了你的相对(相机)3D位置......

因此,如果您只有 RGB,那么:

  1. 创建与目标(感兴趣的对象)相邻的道路像素的投资回报率

  2. 对于每个像素,将 3D 射线从相机焦点投射到芯片传感器上的 2D 位置

  3. 计算射线与地面之间的交点

    结果是你的3D位置......

请注意,这将是非平坦道路(上坡/下坡的弯曲斜坡)的方式

如果你需要更多的3D信息,那么你也可以从地面直接向上投射光线,这样你就可以计算出地面上一些像素的3D信息。

对于与地面无关的东西,你必须找到乙醚(已知物理大小的物体,如路标......),计算它的视觉大小,从中计算比例,然后用它来计算距离,然后你可以计算它的3D位置和它的相邻像素......