diff --git a/Application/Exporter.py b/Application/Exporter.py index 70551b5..2971b99 100644 --- a/Application/Exporter.py +++ b/Application/Exporter.py @@ -1,3 +1,4 @@ +from Application.Config import Config from Application.Layer import Layer from Application.VideoReader import VideoReader from datetime import datetime @@ -82,6 +83,7 @@ class Exporter: maxLength = self.getMaxLengthOfLayers(layers) underlay = cv2.VideoCapture(self.footagePath).read()[1] underlay = cv2.cvtColor(underlay, cv2.COLOR_BGR2RGB) + #underlay = np.zeros(shape=[videoReader.h, videoReader.w, 3], dtype=np.uint8) frames = [] for i in range(maxLength): frames.append(np.copy(underlay)) @@ -99,33 +101,35 @@ class Exporter: for layer in layers: if layer.startFrame <= frameCount and layer.startFrame + len(layer.bounds) > frameCount: for i in range(0, len(layer.bounds[frameCount - layer.startFrame])): - underlay1 = underlay - (x, y, w, - h) = layer.bounds[frameCount - layer.startFrame][i] - mask = layer.masks[frameCount - layer.startFrame][i] - if x is None: - break - factor = videoReader.w / self.resizeWidth - x, y, w, h = (int(x * factor), int(y * factor), - int(w * factor), int(h * factor)) - - mask = imutils.resize(mask, width=w, height=h+1) - mask = np.resize(mask, (h, w)) - mask = cv2.erode(mask, None, iterations=10) - mask *= 255 - frame2 = frames[frameCount - layer.startFrame] - xx = np.copy(cv2.bitwise_and( - frame2[y:y+h, x:x+w], frame2[y:y+h, x:x+w], mask=cv2.bitwise_not(mask))) - frame2[y:y+h, x:x+w] = cv2.addWeighted(xx, 1, np.copy( - cv2.bitwise_and(frame[y:y+h, x:x+w], frame[y:y+h, x:x+w], mask=mask)), 1, 0) - frames[frameCount - layer.startFrame] = np.copy(frame2) - #cv2.imshow("changes x", frame2) - #cv2.waitKey(10) & 0XFF - time = datetime.fromtimestamp( - int(frameCount/self.fps) + videoReader.getStartTime()) - cv2.putText(frames[frameCount - layer.startFrame], f"{time.hour}:{time.minute}:{time.second}", (int( - x+w/2), int(y+h/2)), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2) + try: + underlay1 = underlay + (x, y, w, + h) = layer.bounds[frameCount - layer.startFrame][i] + mask = layer.masks[frameCount - layer.startFrame][i] + if x is None: + break + factor = videoReader.w / self.resizeWidth + x, y, w, h = (int(x * factor), int(y * factor), + int(w * factor), int(h * factor)) + mask = imutils.resize(mask, width=w, height=h+1) + mask = np.resize(mask, (h, w)) + mask = cv2.erode(mask, None, iterations=10) + mask *= 255 + frame2 = frames[frameCount - layer.startFrame] + xx = np.copy(cv2.bitwise_and( + frame2[y:y+h, x:x+w], frame2[y:y+h, x:x+w], mask=cv2.bitwise_not(mask))) + frame2[y:y+h, x:x+w] = cv2.addWeighted(xx, 1, np.copy( + cv2.bitwise_and(frame[y:y+h, x:x+w], frame[y:y+h, x:x+w], mask=mask)), 1, 0) + frames[frameCount - layer.startFrame] = np.copy(frame2) + #cv2.imshow("changes x", frame2) + #cv2.waitKey(10) & 0XFF + time = datetime.fromtimestamp( + int(frameCount/self.fps) + videoReader.getStartTime()) + cv2.putText(frames[frameCount - layer.startFrame], f"{time.hour}:{time.minute}:{time.second}", (int( + x+w/2), int(y+h/2)), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2) + except: + continue videoReader.thread.join() videoReader.vc.release() diff --git a/Application/Layer.py b/Application/Layer.py index a0d949e..b703628 100644 --- a/Application/Layer.py +++ b/Application/Layer.py @@ -88,7 +88,7 @@ class Layer: overlap = False maxLen = min(len(layer2.bounds), len(self.bounds)) bounds = self.bounds[:maxLen] - for b1s, b2s in zip(bounds, layer2.bounds[:maxLen]): + for b1s, b2s in zip(bounds[::10], layer2.bounds[:maxLen:10]): for b1 in b1s: for b2 in b2s: if self.contoursOverlay((b1[0], b1[1]+b1[3]), (b1[0]+b1[2], b1[1]), (b2[0], b2[1]+b2[3]), (b2[0]+b2[2], b2[1])): @@ -98,10 +98,10 @@ class Layer: def timeOverlaps(self, layer2): '''Checks for overlap in time between current and given layer''' - s1 = self.startFrame - e1 = self.lastFrame - s2 = layer2.startFrame - e2 = layer2.lastFrame + s1 = self.exportOffset + e1 = self.lastFrame - self.startFrame + self.exportOffset + s2 = self.exportOffset + e2 = layer2.lastFrame - layer2.startFrame + self.exportOffset if s2 >= s1 and s2 <= e1: return True diff --git a/Application/LayerFactory.py b/Application/LayerFactory.py index 089323d..94efe09 100644 --- a/Application/LayerFactory.py +++ b/Application/LayerFactory.py @@ -125,7 +125,7 @@ class LayerFactory: merge.add(indexes[lc2]) merge = list(merge) if len(merge) > 1: - self.mergeLayers(megre) + self.mergeLayers(merge) i = innerMax def getPossibleLayers(self, t): diff --git a/Application/LayerManager.py b/Application/LayerManager.py index bd8488b..272cb37 100644 --- a/Application/LayerManager.py +++ b/Application/LayerManager.py @@ -8,6 +8,7 @@ import cv2 import numpy as np import time + class LayerManager: def __init__(self, config, layers): self.data = {} @@ -29,7 +30,7 @@ class LayerManager: self.freeMin() print("Before deleting long layers ", len(self.layers)) self.freeMax() - self.sortLayers() + self.sortLayers() self.calcStats() print("Before deleting sparse layers ", len(self.layers)) self.deleteSparse() @@ -55,14 +56,14 @@ class LayerManager: layers = [] for l in self.layers: if len(l) > self.minLayerLength: - layers.append(l) + layers.append(l) self.layers = layers - + def freeMax(self): layers = [] for l in self.layers: if len(l) < self.maxLayerLength: - layers.append(l) + layers.append(l) self.layers = layers def tagLayers(self): @@ -71,7 +72,8 @@ class LayerManager: exporter = Exporter(self.config) start = time.time() for i, layer in enumerate(self.layers): - print(f"{round(i/len(self.layers)*100,2)} {round((time.time() - start), 2)}") + print( + f"{round(i/len(self.layers)*100,2)} {round((time.time() - start), 2)}") start = time.time() if len(layer.bounds[0]) == 0: continue @@ -101,23 +103,22 @@ class LayerManager: videoReader.thread.join() def sortLayers(self): - self.layers.sort(key = lambda c:c.startFrame) + self.layers.sort(key=lambda c: c.startFrame) def calcTimeOffset(self): + lenL = len(self.layers) for i, layer in enumerate(self.layers): + print( + f"\r {i}/{lenL}", end='\r') overlap = True while overlap: overlap = False - for l in self.layers[i:]: - if layer.timeOverlaps(l): - if layer.spaceOverlaps(l): - overlap = True + for l in self.layers[:i:-1]: + if layer.timeOverlaps(l) and layer.spaceOverlaps(l): + overlap = True + break if overlap: - self.addDelay(i, 10) - - if self.layers[i].exportOffset >= 180: - break + self.layers[i].exportOffset += 20 - def addDelay(self, index, frames): - for layer in self.layers[index:]: - layer.exportOffset += frames + if self.layers[i].exportOffset >= 30000: + break diff --git a/main.py b/main.py index f67a23f..a0c2222 100644 --- a/main.py +++ b/main.py @@ -15,7 +15,7 @@ def main(): startTotal = time.time() config = Config() - fileName = "x23-1.mp4" + fileName = "x23.mp4" outputPath = os.path.join(os.path.dirname(__file__), "output") dirName = os.path.join(os.path.dirname(__file__), "generate test footage")