freealise commited on
Commit
d8d1ea1
·
verified ·
1 Parent(s): 11adb5c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +71 -6
app.py CHANGED
@@ -137,6 +137,49 @@ def infer(f_in, interpolation, fps_output):
137
  return final_vid, files
138
 
139
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
140
  def logscale(linear):
141
  return int(math.pow(2, linear))
142
 
@@ -145,14 +188,35 @@ def linscale(linear):
145
 
146
  def sharpest(fl, i):
147
  break_vid = get_frames(fl, "vid_input_frame", "origin", i)
 
 
148
  blur_s = []
149
  for jdx, fr in enumerate(break_vid[0]):
150
- blur_s.append(cv2.Laplacian(cv2.cvtColor(cv2.imread(fr).astype(np.uint8), cv2.COLOR_BGR2GRAY), cv2.CV_64F).var())
 
151
  print(str(int(blur_s[jdx])))
152
 
153
- mx = np.argmax(blur_s)
154
- fl = break_vid[0][mx]
155
- print(str(i) +'th file, sharpest frame: '+str(mx)+', name: '+fl)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
156
  return fl
157
 
158
  def sortFiles(e):
@@ -167,9 +231,10 @@ def loadf(f):
167
  for i, fl in enumerate(f):
168
  ftype = fl.split('/')
169
  if ftype[len(ftype)-1].split('.')[1] == 'mp4':
170
- fnew.append(sharpest(fl, i))
171
  else:
172
- fnew.append(fl)
 
173
  return fnew, fnew
174
  else:
175
  return f, f
 
137
  return final_vid, files
138
 
139
 
140
+ def remove_bg(frame):
141
+ b = 5
142
+ #subtract background (get scene with shadow) and correct hue against light
143
+ bg = cv2.medianBlur(frame, 255)
144
+ bg_gray = cv2.cvtColor(cv2.cvtColor(bg, cv2.COLOR_BGR2GRAY), cv2.COLOR_GRAY2BGR)
145
+ bg_diff = (bg-bg_gray).astype(np.int16)
146
+ frame_ = ((bg.astype(np.int16)-frame.astype(np.int16))+127).astype(np.uint8)
147
+ frame = (frame.astype(np.int16)-bg_diff).astype(np.uint8)
148
+ frame_ = cv2.bilateralFilter(frame_, b*4, b*8, b*2)
149
+
150
+ #remove regions of low saturation (get scene without shadow)
151
+ mask = cv2.cvtColor(frame, cv2.COLOR_RGB2HSV)
152
+ m = cv2.inRange(mask, np.array([0,0,0]), np.array([180,32,256]))
153
+ frame[m>0] = (127,127,127)
154
+ frame_ = cv2.medianBlur(frame_, b)
155
+ element = cv2.getStructuringElement(cv2.MORPH_RECT, (2*b+1, 2*b+1), (b,b))
156
+ frame_ = cv2.erode(cv2.dilate(frame_, element), element)
157
+ frame = cv2.medianBlur(frame, b)
158
+
159
+
160
+ m_ = frame_.reshape((-1,3))
161
+ # convert to np.float32
162
+ m_ = np.float32(m_)
163
+ # define criteria, number of clusters(K) and apply kmeans()
164
+ criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 16, 1.0)
165
+ K = 3
166
+ ret,label,center=cv2.kmeans(m_,K,None,criteria,16,cv2.KMEANS_PP_CENTERS)
167
+ # Now convert back into uint8, and make original image
168
+ center = np.uint8(center)
169
+ res = center[label.flatten()]
170
+ frame_ = res.reshape((frame_.shape))
171
+
172
+
173
+ #remove shadows at edges
174
+ cv2.rectangle(frame_,(0,0),(frame_.shape[1]-1,frame_.shape[0]-1),(142,142,142),7)
175
+ mask = cv2.floodFill(frame_, None, (0, 0), 255, 0, 0, (4 | cv2.FLOODFILL_FIXED_RANGE))[2] #(4 | cv2.FLOODFILL_FIXED_RANGE | cv2.FLOODFILL_MASK_ONLY | 255 << 8)
176
+ # 255 << 8 tells to fill with the value 255)
177
+ mask = mask[1:mask.shape[0]-1, 1:mask.shape[1]-1]
178
+ frame_[mask>0] = (125,125,125)
179
+ frame_[frame_[:,:,0]>=142] = (255,255,255)
180
+
181
+ return frame#, frame_
182
+
183
  def logscale(linear):
184
  return int(math.pow(2, linear))
185
 
 
188
 
189
  def sharpest(fl, i):
190
  break_vid = get_frames(fl, "vid_input_frame", "origin", i)
191
+
192
+ frames = []
193
  blur_s = []
194
  for jdx, fr in enumerate(break_vid[0]):
195
+ frames.append(cv2.imread(fr).astype(np.uint8))
196
+ blur_s.append(cv2.Laplacian(cv2.cvtColor(frames[len(frames)-1], cv2.COLOR_BGR2GRAY), cv2.CV_64F).var())
197
  print(str(int(blur_s[jdx])))
198
 
199
+ indx = np.argmax(blur_s)
200
+ fl = break_vid[0][indx]
201
+
202
+ n = 25
203
+ half = int(n/2)
204
+ if indx-half < 0:
205
+ n = indx*2+1
206
+ elif indx+half >= len(frames):
207
+ n = (len(frames)-1-indx)*2+1
208
+
209
+ #denoise
210
+ frame = cv2.fastNlMeansDenoisingColoredMulti(
211
+ srcImgs = frames,
212
+ imgToDenoiseIndex = indx,
213
+ temporalWindowSize = n,
214
+ hColor = 5,
215
+ templateWindowSize = 21,
216
+ searchWindowSize = 21)
217
+
218
+ cv2.imwrite(fl, frame)
219
+ print(str(i) +'th file, sharpest frame: '+str(indx)+', name: '+fl)
220
  return fl
221
 
222
  def sortFiles(e):
 
231
  for i, fl in enumerate(f):
232
  ftype = fl.split('/')
233
  if ftype[len(ftype)-1].split('.')[1] == 'mp4':
234
+ fl = remove_bg(sharpest(fl, i))
235
  else:
236
+ fl = remove_bg(fl)
237
+ fnew.append(fl)
238
  return fnew, fnew
239
  else:
240
  return f, f