Carla中Camera.listen()输出异常:图像帧叠加问题求助
Carla RGB传感器采集图像出现多帧叠加问题的解决方法
问题描述
为车辆挂载RGB传感器后,采集到的图像并非单帧清晰画面,而是呈现多帧叠加的异常效果,即使尝试使用Pillow的save方法或自定义保存函数也无法解决。
问题代码
import carla import random import time from PIL import Image # 连接客户端并获取世界对象 client = carla.Client('localhost', 2000) world = client.get_world() spectator = world.get_spectator() getLocation = spectator.get_transform() # 设置 spectator 为空变换 spectator.set_transform(carla.Transform()) # 获取蓝图库并筛选车辆蓝图 vehicle_blueprints = world.get_blueprint_library().filter('*vehicle*') # 获取地图的生成点 spawn_points = world.get_map().get_spawn_points() # 随机生成50辆车辆 for _ in range(50): world.try_spawn_actor(random.choice(vehicle_blueprints), random.choice(spawn_points)) # 生成 ego 车辆 ego_vehicle = world.spawn_actor(random.choice(vehicle_blueprints), random.choice(spawn_points)) # 创建相机挂载在车辆顶部的变换 camera_init_trans = carla.Transform(carla.Location(z=4)) # 获取RGB相机蓝图 camera_bp = world.get_blueprint_library().find('sensor.camera.rgb') # 生成相机并挂载到ego车辆 camera = world.spawn_actor(camera_bp, camera_init_trans, attach_to=ego_vehicle) # 问题出在此处的回调逻辑 camera.listen(lambda image: image.save_to_disk('out/%06d.png' % image.frame)) EgoLocation = ego_vehicle.get_location() # 设置所有车辆自动驾驶 for vehicle in world.get_actors().filter('*vehicle*'): vehicle.set_autopilot(True) # 将 spectator 移动到 ego 车辆位置 spectator.set_transform(carla.Transform(EgoLocation)) time.sleep(10) camera.stop()
问题原因
Carla传感器回调中传入的image对象是复用内存空间的,若回调函数未立即处理图像数据,后续帧会覆盖当前帧的内存,最终导致保存的图像出现多帧叠加的混乱效果。lambda的简洁写法容易忽略这个内存复用的底层细节。
解决方案
替换lambda回调为明确的处理逻辑,先创建图像副本再保存,避免原内存被后续帧覆盖:
方案1:使用独立函数处理
def save_image(image): # 创建图像副本,独立于原内存空间 img_copy = image.copy() img_copy.save_to_disk('out/%06d.png' % img_copy.frame) # 注册修改后的回调函数 camera.listen(save_image)
方案2:链式调用简化写法
camera.listen(lambda image: image.copy().save_to_disk('out/%06d.png' % image.frame))
验证效果
修改后重新运行代码,采集到的图像将恢复为单帧清晰画面,与Carla文档预期一致。
内容的提问来源于stack exchange,提问作者ooCrafty
相关产品推荐
相关产品推荐

