# LOG418 線あり・線なしの比べ(v3:回・分け方・出力先を引数で渡す。中身は v2 と同じ) # 使い方: python3 make_crops_v3.py <回の名前> <出力フォルダ> # 元: Log12 予備実験 v2:Unity の録画から、配膳ロボットのまわり3m四方を切り出す # 普段(走っている) = 往復の途中で5秒に0.5m以上動いた時刻。道の記録は走っている時に1m前後ずれるので、 # 記録の位置から1.5m以内で一番近いロボットを録画の中で探し、その位置を中心にする # 普段(止まっている) = 待機場所で待っている・卓で料理を渡している時刻(ふつうの止まり) # 短い止まり = 3〜30秒の止まりの、始まりから3秒後/長い止まり = 30秒以上の止まりの、始まりから15秒後 # A = その時刻の1コマ/B = 10秒前・5秒前・その時刻の3コマを白黒にして重ねた画像 import csv,json,os,sys,random,bisect,glob import numpy as np,cv2 U=os.path.expanduser('~/mnt/KIOXIA/r2r2r-data/service_sim/unity/') OUT=sys.argv[3].rstrip('/')+'/' CROP_M=3.0; SIZE=224; random.seed(0) run=sys.argv[1]; split=sys.argv[2]; d=U+run der=json.load(open(d+'/conditions.json'))['derived']; OX,OZ=der['outer_size_x_m'],der['outer_size_z_m'] mp4=glob.glob(d+'/recordings/*_whole.mp4')[0] W,H=(lambda c:(int(c.get(3)),int(c.get(4))))(cv2.VideoCapture(mp4)); s=W/(OX+1.6) assert abs(H-s*(OZ+1.6))<3,(W,H,s) tr={} for r in csv.DictReader(open(d+'/robot_track.csv')): tr.setdefault(r['robot_id'],[]).append((float(r['t_s']),float(r['x']),float(r['z']),r['phase'])) for k in tr: tr[k].sort() stops=list(csv.DictReader(open(d+'/stops.csv'))) busy={k:[] for k in tr} for r in stops: busy[r['robot_id']].append((float(r['t_s']),float(r['t_s'])+float(r['duration_s']))) def inbusy(rid,t,pre=12,post=2): return any(a-pre<=t<=b+post for a,b in busy[rid]) S=[] for r in stops: dur=float(r['duration_s']); t0=float(r['t_s']) if dur>=30: S.append(['long',r['robot_id'],t0+15,float(r['x']),float(r['z']),dur,r['cause'],False]) elif dur>=3: S.append(['short',r['robot_id'],t0+3,float(r['x']),float(r['z']),dur,r['cause'],False]) sh=[x for x in S if x[0]=='short']; random.shuffle(sh); S=[x for x in S if x[0]=='long']+sh[:120] mv,idle=[],[] for rid,L in tr.items(): for (t1,x1,z1,p1),(t2,x2,z2,p2) in zip(L,L[1:]): if t2<15 or inbusy(rid,t2): continue if p2 in('卓へ','受け渡し口へ') and np.hypot(x2-x1,z2-z1)>=0.5: mv.append(['normal_move',rid,t2,x2,z2,0,'',True]) if p1==p2 and p2 in('待機','往復おわり','卓で止まる') and np.hypot(x2-x1,z2-z1)<0.05: idle.append(['normal_idle',rid,t2,x2,z2,0,p2,False]) random.shuffle(mv); random.shuffle(idle); S+=mv[:250]+idle[:120] def blobs(img): w=(img>235).all(2).astype(np.uint8); n,lab,st,cen=cv2.connectedComponentsWithStats(w) return [cen[i] for i in range(1,n) if 0.06*s*s