diff -urN rt_v6/ax.py rt_v7/ax.py --- rt_v6/ax.py 2018-03-16 20:38:43.000000000 +0900 +++ rt_v7/ax.py 2018-03-21 21:15:26.000000000 +0900 @@ -70,7 +70,7 @@ wh_map = lambda w, h: slide( [-w*0.5,-h*0.5,0] ).compo( zoom_all(1.0/w) ).compo( rot_x(180) ) def fn_map(fn): - (w, h) = img.imgs.wh(fn) + (w, h) = img.wh(fn) return wh_map(w, h) new_line = lambda l: new( l.p, vecs.by_fix_ref('y', l.v, 'z', v.z1) ) diff -urN rt_v6/cg.py rt_v7/cg.py --- rt_v6/cg.py 2018-03-20 15:39:53.000000000 +0900 +++ rt_v7/cg.py 2018-03-21 22:28:22.000000000 +0900 @@ -54,10 +54,12 @@ copen = 'copen-090419.jpg' beat = 'beat.jpg' - #rtd = { 'reflect': 0.3, 'reflact': 0.3, 'density': 1.1 } - rtd = {} + rtd = { 'base': 1.0, 'diff': 0 } - maps = [ { 'fn': copen, 't2m': [ ax.zoom_all(2) ] } ] + maps = [ + { 'fn': 'g43.gif', 'fn_r': 'g43.gif', 't2m': [ ax.zoom_all(8) ] }, + { 'fn': 'g43.gif', 't2m': [ ax.zoom_all(8), ax.zoom_z(-1) ] }, + ] data = [ { 'kind': 'square', diff -urN rt_v6/img.py rt_v7/img.py --- rt_v6/img.py 2018-03-16 20:38:43.000000000 +0900 +++ rt_v7/img.py 2018-03-22 11:28:39.000000000 +0900 @@ -5,8 +5,8 @@ import cv2 import ut -wh = lambda img: ( lambda (h, w, d): (w, h) )( img.shape ) -resize = lambda img, w, h: img if wh(img) == (w, h) else cv2.resize( img, (w, h) ) +img_wh = lambda img: ( lambda (h, w, d): (w, h) )( img.shape ) +resize = lambda img, w, h: img if img_wh(img) == (w, h) else cv2.resize( img, (w, h) ) def new_imgs(): d = {} @@ -18,7 +18,7 @@ return d.get(fn) e.get = get - e.wh = lambda fn: wh( get(fn) ) + e.wh = lambda fn: img_wh( get(fn) ) e.in_img = lambda fn, x, y: ( lambda (w, h): 0 <= x and x < w and 0 <= y and y < h )( e.wh(fn) ) e.col = lambda fn, x, y, def_col=[128,128,128]: get(fn)[y, x] if e.in_img(fn, x, y) else def_col @@ -26,6 +26,67 @@ imgs = new_imgs() +def read_video(fn): + vc = cv2.VideoCapture(fn) + ks = [ + cv2.CAP_PROP_FRAME_WIDTH, + cv2.CAP_PROP_FRAME_HEIGHT, + cv2.CAP_PROP_FPS, + ] + (w, h, fps) = map( vc.get, ks ) + (w, h) = map( int, (w, h) ) + + video = [] + while vc.isOpened(): + (ret, img) = vc.read() + if not ret: + break + video.append(img) + n = len(video) + + return { 'w': w, 'h': h, 'n': n, 'fps': fps, 'imgs': video } + +def new_videos(): + d = {} + e = ut.Empty() + + def get(fn): + if fn not in d: + d[fn] = read_video(fn) + return d.get(fn) + e.get = get + + e.w = lambda fn: get(fn).get('w') + e.h = lambda fn: get(fn).get('h') + e.wh = lambda fn: ( e.w(fn), e.h(fn) ) + e.n = lambda fn: get(fn).get('n') + e.fps = lambda fn: get(fn).get('fps') + e.imgs = lambda fn: get(fn).get('imgs') + + img_sec = lambda fn, sec: e.imgs(fn)[ int( e.fps(fn) * sec ) % e.n(fn) ] + e.in_img = lambda fn, x, y: ( lambda (w, h): 0 <= x and x < w and 0 <= y and y < h )( e.wh(fn) ) + e.col = lambda fn, sec, x, y, def_col=[128,128,128]: img_sec(fn, sec)[y, x] if e.in_img(fn, x, y) else def_col + + return e + +videos = new_videos() + +def fn_typ(fn): + # 'v': video, 'i': image + vs = [ 'mp4', 'avi', 'mov', 'gif' ] + vs = sum( map( lambda s: [ s, s.upper() ], vs ) , [] ) + for s in vs: + if fn.endswith('.' + s): + return 'v' + return 'i' + +wh = lambda fn: ( videos if fn_typ(fn) == 'v' else imgs ).wh(fn) + +def col(fn, sec, x, y, def_col=[128,128,128]): + if fn_typ(fn) == 'v': + return videos.col(fn, sec, x, y, def_col) + return imgs.col(fn, x, y, def_col) + def new_wimg(w, h, def_col=[0,0,0]): e = ut.Empty() e.img = np.empty( (h, w, 3), dtype=np.uint8 ) @@ -80,19 +141,27 @@ fourcc = f(*codec) (vw, vh) = ( int(w*zm), int(h*zm) ) writer = cv2.VideoWriter( fn, fourcc, fps, (vw, vh) ) - e.add_img = lambda : writer.write( resize( e.img, vw, vh ) ) + + def add_img(): + writer.write( resize( e.img, vw, vh ) ) + e.i += 1 + e.add_img = add_img + e.show_zm = lambda title='', sec=-1: e.show(title, sec, zm) e.fin = lambda : writer.release() + e.i = 0 + e.cur_sec = lambda : float(e.i) / fps return e def imgs_to_video(img_name, video_name, fps, zm): cmd = 'ls {}[0-9]*.jpg'.format(img_name) lst = ut.cmd_exec(cmd).strip().split('\n') - imgs = new_imgs() (w, h) = imgs.wh(lst[0]) codec = 'H264' - fn = video_name + '.mp4' + fn = video_name + if not fn.endswith('.mp4'): + fn += '.mp4' video = new_video(codec, fn, fps, w, h, zm) for fn in lst: @@ -100,16 +169,46 @@ video.add_img() video.fin() +def video_to_imgs(img_name, video_name): + fn = video_name + if fn_typ(fn) != 'v': + fn += '.mp4' + n = videos.n(fn) + imgs = videos.imgs(fn) + ut.mkdir_if_not(img_name) + for i in range(n): + fn = ( img_name+'0000{}'.format(i)[-5:] ) + '.jpg' + cv2.imwrite(fn, imgs[i] ) + +def video_play(fn): + if fn_typ(fn) != 'v': + fn += '.mp4' + fps = videos.fps(fn) + st_sec = ut.now_sec() + wait_sec = lambda i: float(i) / fps - ( ut.now_sec() - st_sec ) + for (i, img) in enumerate( videos.imgs(fn) ): + cv2.imshow('', img) + sec = max( wait_sec(i), 0 ) + msec = max( 1, int(sec * 1000) ) + cv2.waitKey(msec) + if __name__ == "__main__": if len(sys.argv[1:]) < 2: - print 'Usage: {} img_name video_name fps= zm= codec='.format(sys.argv[0]) + print 'Usage: {} img_name video_name fps= zm= cmd='.format(sys.argv[0]) print ' fps is int value (default 30)' print ' zm is float value (default 1.0)' + print ' cmd is v2i, i2v or play (default i2v)' sys.exit(0) img_name = sys.argv[1] video_name = sys.argv[2] - fps = ut.arg_i('fps', 30) - zm = ut.arg_f('zm', 1.0) - imgs_to_video(img_name, video_name, fps, zm) + cmd = ut.arg_s('cmd', 'i2v') + if cmd == 'i2v': + fps = ut.arg_i('fps', 30) + zm = ut.arg_f('zm', 1.0) + imgs_to_video(img_name, video_name, fps, zm) + elif cmd == 'v2i': + video_to_imgs(img_name, video_name) + elif cmd == 'play': + video_play(video_name) # EOF diff -urN rt_v6/rt.py rt_v7/rt.py --- rt_v6/rt.py 2018-03-20 15:33:43.000000000 +0900 +++ rt_v7/rt.py 2018-03-21 21:20:02.000000000 +0900 @@ -8,7 +8,7 @@ import cross import img -def map_col(d, crs, rev): +def map_col(d, crs, rev, video): def_col = d.get( 'def_col', v.all(128) ) if 'maps' not in d: @@ -24,14 +24,15 @@ if not fn: return [] (x, y, _) = lstx.tr( m.get('wh2xyz'), 'g2l', nv_line.p ) - return img.imgs.col( fn, int(x), int(y), [] ) + sec = video.cur_sec() + return img.col( fn, sec, int(x), int(y), [] ) cols = map( f, d.get('maps') ) cols = filter( lambda col: col != [], cols ) col = v.lst_add(cols) if cols else def_col return map( lambda v: min(v, 255), col ) -def get_col(data, lights, l_g, nest_rate=1.0, ref_len=None): +def get_col(data, lights, l_g, video, nest_rate=1.0, ref_len=None): if nest_rate < 0.01: return [] @@ -60,7 +61,7 @@ ang_nv_eyev_nega = -ang_nv_eyev rev = ang_nv_eyev_nega < 0 - col = map_col( d, crs, rev ) + col = map_col( d, crs, rev, video ) def diffusivity(): diff = rtd.get('diff', 0.9) @@ -89,7 +90,7 @@ return [] ref_v = v.op2( '+', v.op1( '*', nv, 2 * ang_nv_eyev_nega ), eyev ) ref_l = line.new( crsp, ref_v ) - col = get_col( data, lights, ref_l, nest_rate * reflect, crst ) + col = get_col( data, lights, ref_l, video, nest_rate * reflect, crst ) return v.op1( '*', col, reflect ) col_ = reflect_col() @@ -117,7 +118,7 @@ return [] ref_v = reflact_v() ref_l = line.new( crsp, ref_v ) - col = get_col( data, lights, ref_l, nest_rate * reflact, crst ) + col = get_col( data, lights, ref_l, video, nest_rate * reflact, crst ) return v.op1( '*', col, reflact ) col_ = reflact_col() @@ -134,7 +135,7 @@ (ix, iy) = cnt.cur() p = lstx.tr( wh2g, 'l2g', [ix,iy,-d_] ) l_g = line.new_p2(eye2g.p, p) - col = get_col(data, lights, l_g) + col = get_col(data, lights, l_g, video) if col: video.set(ix, iy, col) # EOF