defmain(): clearAll() loadWorlds() loadObjs() loadCamera() scene = bpy.context.scene # 获取当前场景 scene.camera = scene.objects['Camera'] # 将场景中的相机设置为所加载的相机 scene.render.resolution_x = img_w # 设置输出图像的宽度 scene.render.resolution_y = img_h # 设置输出图像的高度 K = calibCamera() # 计算相机内部参数,即相机的内参矩阵 changeTheWorld() # 改变场景环境(比如更改场景光照等),使得每张图片看起来不完全一样 for i inrange(picsNum): # 循环输出多张图片 if i % freq_CTW == 0: changeTheWorld() changeObjs() # 改变场景中的物体位置和姿态,使得每张图片中物体的位置和姿态发生变换 bougeLe() # 让场景中的物体随机移动一定距离(模拟物体在真实场景中的运动) snapIt(scene, i) # 对场景进行拍照,生成一张渲染后的图像 labelIt(i) # <- TODO calId = f'{kittiCalibsPath}{i}.txt'# 写入参数 withopen(calId,'w',encoding='utf-8') as fc: for p in K: fc.writelines(p) #clearAll() if __name__ == '__main__': main()
clearAll()
删除场景中的所有对象:
1 2 3 4 5 6 7 8 9 10 11 12 13
defclearAll(): for obj in bpy.data.objects: bpy.data.objects.remove(obj) for img in bpy.data.images: bpy.data.images.remove(img) for ma in bpy.data.materials: bpy.data.materials.remove(ma) for me in bpy.data.meshes: bpy.data.meshes.remove(me) for ng in bpy.data.node_groups: bpy.data.node_groups.remove(ng) for cd in bpy.data.cameras: bpy.data.cameras.remove(cd)
loadWorlds()
world 是一系列 *.hdr 文件并存放在 worldPath 中,加载它们:
1 2 3 4 5 6 7
defloadWorlds(): world = bpy.context.scene.world world.use_nodes = True enode = bpy.context.scene.world.node_tree.nodes.new('ShaderNodeTexEnvironment') worldFiles = os.listdir(worldPath) for file in worldFiles: bpy.data.images.load(worldPath + file)
loadObjs()
objs 是一系列 *.blend 文件并存放在 objsPath 中,加载它们:
1 2 3 4 5 6 7 8 9 10 11 12 13
defloadObjs(): objsList = os.listdir(objsPath) for objName in objsList: file_path = os.path.join(objsPath, objName) objN = objName.split('.')[0] # 获取物体名称(去除后缀) objNameList.append(objN) # 将物体名称添加到物体名称列表中 # 加载 .obj 文件并将其中包含的物体(对象)添加到当前场景中 with bpy.data.libraries.load(file_path,link=False) as (data_from, data_to): # 只将以当前物体名称开头的对象添加到当前场景中,避免将不需要的对象添加到场景中 data_to.objects = [name for name in data_from.objects if name.startswith(objN)] # 该部分是注释掉的代码,原本是想将已经加载的物体名称保存到 YAML 文件中,但是最终没有实现。 #with open(cocoYaml,'w',encoding='utf-8') as fc: #yaml.dump(objNameList,fc)