ROS+CARLA环境下3D车辆位置转2D图像Bounding Box实现求助
CARLA相机3D转2D Bounding Box的正确方法
获取相机内参(焦距、主点)
CARLA的RGB相机传感器会直接提供内参参数,不需要手动猜测,两种获取方式:
- ROS话题方式:订阅相机的
/carla/<camera_name>/camera_info话题,消息类型为sensor_msgs/CameraInfo,其中的K矩阵包含核心参数:- 焦距:
fx = K[0],fy = K[4] - 主点:
cx = K[2],cy = K[5]
- 焦距:
- Python API方式:直接从相机蓝图读取属性:
camera_bp = blueprint_library.find('sensor.camera.rgb') # 读取焦距 fx = camera_bp.get_attribute('focal_length').as_float() # 主点默认是图像中心,也可通过属性计算 img_w = camera_bp.get_attribute('image_size_x').as_int() img_h = camera_bp.get_attribute('image_size_y').as_int() cx = img_w / 2.0 cy = img_h / 2.0
3D坐标转2D像素流程
1. 计算目标相对自车的局部坐标
CARLA世界坐标系是x向东、y向北、z向上,需要先转换为自车局部坐标系(x向前、y向左、z向上):
- 已知自车世界位置
ego_pos=(x_ego,y_ego,z_ego)、目标世界位置target_pos=(x_t,y_t,z_t),先算世界空间相对差:rel_x = x_t - x_ego rel_y = y_t - y_ego rel_z = z_t - z_ego - 结合自车yaw角(弧度,逆时针为正)做旋转变换,得到自车局部坐标:
rel_x_local = rel_x * cos(yaw) + rel_y * sin(yaw) rel_y_local = -rel_x * sin(yaw) + rel_y * cos(yaw) rel_z_local = rel_z
2. 转换为相机坐标系坐标
相机通常有相对于自车的安装偏移(位置cam_offset=(x_off,y_off,z_off)、姿态cam_yaw,cam_pitch,cam_roll):
- 先算目标相对相机的位置:
cam_x = rel_x_local - x_off cam_y = rel_y_local - y_off cam_z = rel_z_local - z_off - 通过相机姿态的旋转矩阵,将坐标转换为相机坐标系(CARLA相机坐标系为x向右、y向下、z向前)。
3. 透视投影得到2D像素
若相机坐标系下点为(X,Y,Z)(Z必须>0,否则目标在相机后方),用内参做投影:
u = fx * (X / Z) + cx v = fy * (Y / Z) + cy
其中u是图像x轴像素坐标,v是y轴像素坐标。
生成目标Bounding Box
目标尺寸(length,width,height)对应自车坐标系的前后、左右、上下方向,先生成自身局部坐标系下的8个包围盒角点:
corners_local = [ (length/2, width/2, height/2), (length/2, width/2, -height/2), (length/2, -width/2, height/2), (length/2, -width/2, -height/2), (-length/2, width/2, height/2), (-length/2, width/2, -height/2), (-length/2, -width/2, height/2), (-length/2, -width/2, -height/2) ]
将每个角点转换为世界坐标后,重复上述3D转2D流程,过滤掉Z≤0的不可见点,最后取所有可见点的最小/最大u、v值,得到Bounding Box的(x_min,y_min,x_max,y_max)。
内容的提问来源于stack exchange,提问作者wiswasi
相关产品推荐
相关产品推荐

