summaryrefslogtreecommitdiff
path: root/scripts/flow/flow-warp-recflow.py
blob: 5e0d7ac8612ce72dd3229e4f542ba1002091e90d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import os
import sys
from shutil import move, copyfile
from PIL import Image, ImageOps
from shutil import copyfile, rmtree
import numpy as np
import cv2

from_dir = "IMG_1734/"
to_dir = "IMG_1738/"
render_dir = "flowwarp_transfer_cross/"

if os.path.exists(render_dir):
    rmtree(render_dir)

os.makedirs(render_dir)
os.makedirs(render_dir + 'out_fwd_from/')
os.makedirs(render_dir + 'out_rvr_from/')
os.makedirs(render_dir + 'out_fwd_from_rec/')
os.makedirs(render_dir + 'out_rvr_from_rec/')
os.makedirs(render_dir + 'out_fwd_to/')
os.makedirs(render_dir + 'out_rvr_to/')
os.makedirs(render_dir + 'out_fwd_to_rec/')
os.makedirs(render_dir + 'out_rvr_to_rec/')

def warp_flow(img, flow):
  h, w = flow.shape[:2]
  flow = -flow
  flow[:,:,0] += np.arange(w)
  flow[:,:,1] += np.arange(h)[:,np.newaxis]
  res = cv2.remap(img, flow, None, cv2.INTER_LINEAR)
  return res
def load(path):
  pil_image = Image.open(path).convert('RGB')
  im = np.array(pil_image)
  im = im[:, :, ::-1].copy()
  gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
  return im, gray

def get_files(d):
  return sorted([i.name for i in os.scandir(d) if os.path.isfile(d + i.name) and not i.name.startswith('.') and i.name.endswith('png')])

hsv = []
prev = None
prev_bgr = None
gray = None
prev_gray = None
prev_from = None
prev_fwd_from = None
prev_rvr_from = None
prev_from_gray = None
prev_to = None
prev_fwd_to = None
prev_rvr_to = None
prev_to_gray = None

from_files = get_files(from_dir)
to_files = get_files(to_dir)

for i,from_fn in enumerate(from_files):
  print(from_fn)
  to_fn = to_files[i]

  # load image and convert to grayscale
  from_im, from_gray = load(from_dir + from_fn)
  to_im, to_gray = load(to_dir + to_fn)

  # store first frame
  if prev_from_gray is None:
    prev_fwd_from = from_im
    prev_rvr_from = from_im
    prev_from_gray = from_gray
    prev_fwd_to = to_im
    prev_rvr_to = to_im
    prev_to_gray = to_gray
    #hsv = np.zeros((256,512,3))
    #hsv[...,1] = 255
    continue

  # compute optical flow
  from_fwd_flow = cv2.calcOpticalFlowFarneback(prev_from_gray, from_gray, None, 0.5, 3, 15, 3, 5, 1.2, 0)
  #from_rvr_flow = cv2.calcOpticalFlowFarneback(from_gray, prev_from_gray, None, 0.5, 3, 15, 3, 5, 1.2, 0)
  #to_fwd_flow = cv2.calcOpticalFlowFarneback(prev_to_gray, to_gray, None, 0.5, 3, 15, 3, 5, 1.2, 0)
  #to_rvr_flow = cv2.calcOpticalFlowFarneback(to_gray, prev_to_gray, None, 0.5, 3, 15, 3, 5, 1.2, 0)
  #cross_fwd_flow = cv2.calcOpticalFlowFarneback(from_gray, to_gray, None, 0.5, 3, 15, 3, 5, 1.2, 0)
  #cross_rvr_flow = cv2.calcOpticalFlowFarneback(to_gray, from_gray, None, 0.5, 3, 15, 3, 5, 1.2, 0)

  #mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1])
  #hsv[...,0] = ang * 180 / np.pi / 2
  #hsv[...,2] = cv2.normalize(mag, None, 0, 255, cv2.NORM_L2)
  #bgr = cv2.cvtColor(hsv.astype('uint8'), cv2.COLOR_HSV2BGR)

  #if prev_bgr is None:
  #  prev_bgr = np.copy(bgr)
  #  continue

  #if (i % 10) == 3:
  #  wd = "test/"
  #elif (i % 10) == 6:
  #  wd = "val/"
  #else:
  #  wd = "train/"

  fwd_flow = from_fwd_flow
  #rvr_flow = from_rvr_flow
  out_fwd_from = warp_flow(from_im, fwd_flow)
  out_fwd_from_rec = warp_flow(prev_fwd_from, fwd_flow)
  out_fwd_to = warp_flow(to_im, fwd_flow)
  out_fwd_to_rec = warp_flow(prev_fwd_to, fwd_flow)

  #out_rvr_from = warp_flow(from_im, rvr_flow)
  #out_rvr_from_rec = warp_flow(prev_rvr_from, rvr_flow)
  #out_rvr_to = warp_flow(to_im, rvr_flow)
  #out_rvr_to_rec = warp_flow(prev_rvr_to, rvr_flow)

  ren = "frame_{:05d}.png".format(i)
  #cv2.imwrite(render_dir + "A/" + wd + ren, prev_bgr)
  #cv2.imwrite(render_dir + "B/" + wd + ren, bgr)
  cv2.imwrite(render_dir + "out_fwd_from/" + ren, out_fwd_from)
  cv2.imwrite(render_dir + "out_fwd_from_rec/" + ren, out_fwd_from_rec)
  cv2.imwrite(render_dir + "out_fwd_to/" + ren, out_fwd_to)
  cv2.imwrite(render_dir + "out_fwd_to_rec/" + ren, out_fwd_to_rec)
  #cv2.imwrite(render_dir + "out_rvr_from/" + ren, out_rvr_from)
  #cv2.imwrite(render_dir + "out_rvr_from_rec/" + ren, out_rvr_from_rec)
  #cv2.imwrite(render_dir + "out_rvr_to/" + ren, out_rvr_to)
  #cv2.imwrite(render_dir + "out_rvr_to_rec/" + ren, out_rvr_to_rec)
  #cv2.imwrite(render_dir + "next/" + ren, out_next)
  # copyfile(work_dir + fn, render_dir + "B/" + wd + ren)

  prev_from_gray = from_gray
  prev_to_gray = to_gray
  if i > 3:
    prev_from_gray = cv2.cvtColor(out_fwd_from_rec, cv2.COLOR_BGR2GRAY)
    prev_fwd_from = out_fwd_from_rec
    prev_fwd_to = out_fwd_to_rec
    #prev_rvr_from = out_rvr_from_rec
    #prev_rvr_to = out_rvr_to_rec
  #prev_bgr = np.copy(bgr)