Skip to content

Instantly share code, notes, and snippets.

@helxsz
Created June 3, 2017 01:35
Show Gist options
  • Save helxsz/85845dba6b9ff496ff52b2e17b8cda4f to your computer and use it in GitHub Desktop.
Save helxsz/85845dba6b9ff496ff52b2e17b8cda4f to your computer and use it in GitHub Desktop.
create car Parking scene
#coding=utf-8
import sys
sys.path.append("/usr/local/lib/python2.7/dist-packages")
print (sys.path)
import bpy
import math
import random
import colorsys
import os
import mathutils
#import png
'''
代码使用全随机方式,生产各种停车场图片
定义了停车场中各组停车位的顶角坐标和相机的相关参数
实际图片生产中,停车场打印的组数由Car_print_team_num控制,
实际打印时只需要更改Car_print_team_num和camera的相关参数即可,位置定义和概率分布等已经比较良好的实现
'''
rot_x = 43
rot_y = 43
# rendering constants
RENDER_RES_X = 640
RENDER_RES_Y = 480
FRAME_NO = 1
sunlight_from = [2]
sunlight_to = [2]
blur_from = 0.0
blur_to = 0.0
dof = False
saturation_factor = 1.0
value_factor = 1.0
# ranges
SUNLIGHT_VALUES = [0.01, 0.5, 1.0, 1.5, 2.0, 2.5]
#define car space apart
Car_Space_left_apart_right=2.74
Car_Space_up_apart_down=5.3
#define sapce start posi and car print rows ranks
Car_space_start_posi=[[2,3]]
Car_print_rows=2
Car_print_ranks=5
Car_num_total=Car_print_rows*Car_print_ranks
Car_print_team_num=1
Car_probability=0.8
#define car classes
Car_classes=['AudiA8','AudiA8.001','AudiA8.002','AudiA8.003','AudiA8.004','BMW335i','BMW335i.001',
'BMW335i.002','BMW335i.003','BMW335i.004','BMWM1','BMWM1.001','BMWM1.002','BMWM1.003','BMWM1.004',
'DodgeRamPickup','DodgeRamPickup.001','DodgeRamPickup.002','FIAT500','FIAT500.001','FIAT500.002',
'FIAT500.003','FIAT500.004','VWGolfMK4.001','VWGolfMK4','VWGolfMK4.002','VWGolfMK4.003','VWGolfMK4.004',
'VWTouareg','VWTouareg.001','VWTouareg.002'
]
#define car space top position
Car_Space_Position_Top=[
[[-62,29.23],[-49.73,29.23],[-31.82,29.23],[-14.2,29.23],[3.51,29.23],[21.21,29.23],[39.04,29.23],[57.1,29.23]],
[[-62,11.28],[-49.73,11.28],[-31.82,11.28],[-14.2,11.28],[3.51,11.28],[21.21,11.28] ,[39.04,11.28],[57.1,11.8]],
[[-62,-5.54],[-49.73,-5.54],[-31.82,-5.54] ,[-14.2,-5.54],[3.51,-5.54],[21.21,-5.54],[39.04,-5.54],[57.1,-5.54]],
[[-62,-23.1],[-49.73,-23.1],[-31.82,-23.1],[-14.2,-23.1],[3.51,-23.1],[21.21,-23.1],[39.04,-23.1] ,[57.1,-23.1]]
]
#func two define ten posi
Car_num_ten_Posi=[
[-14.2,11.21],[-11.45,11.21],[-8.71,11.21],[-6.2,11.21],[-3.45,11.21],
[-14.2,5.95],[-11.45,5.95],[-8.71,5.95],[-6.2,5.95],[-3.45,5.95]
]
#func one set Camera paramter,with different rota
Cam_rota=[[[10,0,0],[-9,-13,22]],
[[20,0,0],[-9,-17,21]],
[[30,0,0],[-9,-21,19]],
[[40,0,0],[-9,-23,16]],
[[50,0,0],[-9,-26,13]],
[[60,0,60],[10,-19,10]],#[60,0,60]参数表示[pitch,yaw,roll],[10,-19,10]表示[x,y,z]坐标,改变摄像头的参数从这六个参数修改即可。
[[70,0,0],[-9,-31,6]],
[[80,0,0],[-9,-31,6]]
]
car_num = 1000
def createParkingScene(output_dir, car_num, pitch, roll, xyz):
output_dir = output_dir+'{}_{}'.format(str(pitch), str(roll))
car_num = car_num;
output_dir = output_dir;
if not os.path.exists(output_dir):
os.makedirs(output_dir)
if not os.path.exists(output_dir + '/images'):
os.makedirs(output_dir + '/images')
if not os.path.exists(output_dir + '/annotations'):
os.makedirs(output_dir + '/annotations')
if not os.path.exists(output_dir + '/prepare'):
os.makedirs(output_dir + '/prepare')
bpy.context.scene.frame_current = FRAME_NO
bpy.context.scene.render.resolution_x = RENDER_RES_X
bpy.context.scene.render.resolution_y = RENDER_RES_Y
bpy.context.scene.render.use_border = False
annot_file = open(output_dir + '/annotations.txt', 'w+')
space_file = open(output_dir + '/space.txt', 'w+')
annot_file.write('')
nodes = bpy.context.scene.node_tree.nodes
links = bpy.context.scene.node_tree.links
nodes['File Output'].base_path = output_dir
#set camera location
#bpy.data.objects['Camera'].location = xyz
#bpy.data.objects['Camera'].rotation_euler = [math.radians(pitch), math.radians(0), math.radians(roll)]
bpy.data.objects['Camera'].location = [10,-19,10]
bpy.data.objects['Camera'].rotation_euler = [60, math.radians(0), 60]
#get random carSpace satrt position
def getCarSpace_Start_posi(Car_Space_Start_num):
return random.sample(Car_space_start_posi,Car_Space_Start_num)
#get random CarClasses
def getRandomCarClasses(Car_print_team_num,Car_print_rows,Car_print_ranks):
return random.sample(Car_classes,Car_print_rows*Car_print_ranks*Car_print_team_num)
#define get sapce position
def getCarSpace_Position(car_sapce_posi_top_row,car_sapce_posi_top_rank,car_num):
if car_num<5:
Car_print_posi=[Car_Space_Position_Top[car_sapce_posi_top_row][car_sapce_posi_top_rank][0]+(car_num)*Car_Space_left_apart_right,Car_Space_Position_Top[car_sapce_posi_top_row][car_sapce_posi_top_rank][1]]
print(str(Car_print_posi)+'****')
return Car_print_posi
else:
Car_print_posi=[Car_Space_Position_Top[car_sapce_posi_top_row][car_sapce_posi_top_rank][0]+(car_num-5)*Car_Space_left_apart_right,Car_Space_Position_Top[car_sapce_posi_top_row][car_sapce_posi_top_rank][1]-Car_Space_up_apart_down-0.8]
print(str(Car_print_posi)+'****')
return Car_print_posi
#set carSpace empty
def setCarSpace_random_empty(Car_probability):
Car_weight=10*(1-Car_probability)
isEmpty=random.randint(0,10)
if isEmpty>Car_weight:
isEmpty=1
else:
isEmpty=0
return isEmpty
def get_Ranom_Color():
r, g, b = [random.random() for i in range(3)]
return r, g, b
def hide_all_parkingSpot():
for parkingSpot in PARKING_CLASSES:
bpy.data.objects[parkingSpot].hide_render = True
def choose_car_position_byname(name, posi_x,posi_y,posi_z=0,Car_probability=1):
if setCarSpace_random_empty(Car_probability)==1:
bpy.data.objects[name].hide_render = False
annot_file.write('1 ')
else:
print('it did not print\n')
annot_file.write('0 ')
vec = mathutils.Vector((posi_x,posi_y, posi_z))
inv = bpy.data.objects[name].matrix_world.copy()
print('>>>>>>>>>>>>')
print (vec)
print (inv)
inv.invert()
# vec aligned to local axis
vec_rot = vec * inv
print (vec_rot)
print (name)
#annot_file.write(vec_rot)
#annot_file.write('\tvec_rot:\t'+str(vec_rot)+'\t')
bpy.data.objects[name].location = vec
bpy.data.objects[name].show_bounds = True
print (bpy.data.objects[name])
return bpy.data.objects[name]
def hide_all_cars(myCar_classes):
for car in myCar_classes:
bpy.data.objects[car].hide_render = True;
def get_Random_Car():
posi_x_y = []
#1.hide all cars
#2.random get print car num
#3.random set car space have car or not
#4.set car in car space
#5.print picature and print annotation
filepath1 = output_dir + '/images/' + str(i+1) + '.png'
filepath2 = output_dir + '/images2/' + str(i+1) + '.png'
hide_all_cars(Car_classes)
car_classes_print_list=getRandomCarClasses(Car_print_team_num,Car_print_rows,Car_print_ranks)
car_space_posi_list=getCarSpace_Start_posi(Car_print_team_num)
annot_file.write(str(filepath1)+'\t')
#func_1
posi_z=0
print('>>>>'+str(car_classes_print_list)+'\n'+str(car_space_posi_list)+'\n')
print(str(car_space_posi_list)+' '+str(Car_print_rows)+' '+str(Car_print_ranks))
for car_space_posi_list_len in range(0,len(car_space_posi_list)):
for car_posi_print_row_len in range(0,Car_print_rows):
for car_posi_print_rank_len in range(0,Car_print_ranks):
print('is is '+str(Car_print_rows*Car_print_ranks+car_posi_print_row_len*Car_print_ranks+car_posi_print_rank_len)+'--\n')
car_name=car_classes_print_list[Car_print_rows*Car_print_ranks*car_space_posi_list_len+car_posi_print_row_len*Car_print_ranks+car_posi_print_rank_len]
car_print_posi=getCarSpace_Position(car_space_posi_list[car_space_posi_list_len][0],car_space_posi_list[car_space_posi_list_len][1],car_posi_print_row_len*Car_print_ranks+car_posi_print_rank_len)
#annot_file.write(str(car_name)+' '+str(car_print_posi)+' ')
#print(str(car_space_posi_list_len)+' '+str(car_posi_print_row_len)+' '+str(car_posi_print_rank_len)+'\t'+str(car_space_posi_list_len*Car_print_rows*Car_print_ranks+Car_print_rows*car_posi_print_rank_len+car_posi_print_rank_len)+' '+str(car_name)+'\n')
posi_x=car_print_posi[0]
posi_y=car_print_posi[1]
choose_car_position_byname(car_name, posi_x,posi_y,posi_z,Car_probability)
################计算每辆车与摄像头的水平和垂直距离###################
if bpy.data.objects[car_name].hide_render == False:#判断该车位上是否有车
posi_x_y.append([posi_x,posi_y])
print (posi_x_y)
space_file.write(filepath1+' ')
for j in range(0,len(posi_x_y)):
Horizontal_Distance =math.sqrt((posi_x_y[j][0]-Cam_rota[5][1][0])**2+(posi_x_y[j][1]-Cam_rota[5][1][1])**2)
Vertical_Distance = Cam_rota[5][1][2]
space_file.write(str(Horizontal_Distance)+' ')
space_file.write(str(Vertical_Distance)+' ')
space_file.write('\n')
####################################################################
filepath = output_dir + '/images/' + str(i + 1) + '.png'
bpy.context.scene.render.filepath = filepath
nodes['File Output'].file_slots[0].path = '/images2/'+str(i + 1)
print('Rendering car no. ' + str(i + 1))
bpy.ops.render.render(write_still = True)
annot_file.write('\n')
annot_file.flush()
space_file.flush()
for i in range(0, car_num):
get_Random_Car()
annot_file.close()
if __name__=="__main__":
#加载配置文件,摄像头角度距离车辆数目等
f_parkCon='/home/gnss/si/Blender_test/parkinglot/parkingline.conf'
f_parkCon_=open(f_parkCon,'r')
f_parkCon_lines=f_parkCon_.readlines()
for f_parkCon_line in f_parkCon_lines:
f_parkCon_line_=f_parkCon_line.split(':')
if f_parkCon_line_[0]=='CAMERA_DISTANCE':
print(f_parkCon_line_[1],'\n')
CAMERA_DISTANCE=float(f_parkCon_line_[1])
elif f_parkCon_line_[0]=="rot_x":
print(f_parkCon_line_[1],'\n')
rot_x=float(f_parkCon_line_[1])
elif f_parkCon_line_[0]=="rot_y":
print(f_parkCon_line_[1],'\n')
rot_y=float(f_parkCon_line_[1])
elif f_parkCon_line_[0]=="car_num":
print(f_parkCon_line_[1],'\n')
car_num=int(f_parkCon_line_[1])
else:
print('\n-------------------- warning')
createParkingScene("/home/gnss/si/Blender_test/parkinglot/Blender_render/",2,60,60,[10,-19,10])
#createParkingScene("/home/gnss/si/Blender_test/parkinglot/Blender_render/",2,30,45)
#createParkingScene("/home/gnss/si/Blender_test/parkinglot/Blender_render/",2,30,60)
@helxsz
Copy link
Author

helxsz commented Jun 3, 2017

./blender -b /home/gnss/si/Blender_test/parkinglot/ParkingLot.blend -P /home/gnss/si/Blender_test/parkinglot/parkinglot_line1.py

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment