diff --git a/Application/Config.py b/Application/Config.py index 38a0fae..a4cf15b 100644 --- a/Application/Config.py +++ b/Application/Config.py @@ -13,7 +13,7 @@ class Config: "maxLength": None, "ttolerance": 60, "videoBufferLength": 1000, - "noiseThreashold": 0.2, + "noiseThreashold": 0.05, "noiseSensitivity": 3/4 } diff --git a/Application/Exporter.py b/Application/Exporter.py index 69be7d6..f80252f 100644 --- a/Application/Exporter.py +++ b/Application/Exporter.py @@ -132,4 +132,4 @@ class Exporter: frameNumbers.update( list(range(layer.startFrame, layer.startFrame + len(layer.bounds)))) - return list(frameNumbers) + return sorted(list(frameNumbers)) diff --git a/Application/LayerFactory.py b/Application/LayerFactory.py index 972e66e..f8573fd 100644 --- a/Application/LayerFactory.py +++ b/Application/LayerFactory.py @@ -1,6 +1,10 @@ from Application.Layer import Layer from Application.Config import Config +from Application.VideoReader import VideoReader +from Application.Exporter import Exporter from multiprocessing.pool import ThreadPool +import cv2 +import numpy as np class LayerFactory: def __init__(self, config, data=None): @@ -18,8 +22,6 @@ class LayerFactory: if data is not None: self.extractLayers(data) - - def removeStaticLayers(self): '''Removes Layers with little to no movement''' layers = [] @@ -127,10 +129,32 @@ class LayerFactory: return True def fillLayers(self): - for i in range(len(self.layers)): - if i % 20 == 0: - print(f"filled {int(round(i/len(self.layers),2)*100)}% of all Layers") - self.layers[i].fill(self.footagePath, self.resizeWidth) + + listOfFrames = Exporter(self.config).makeListOfFrames(self.layers) + videoReader = VideoReader(self.config, listOfFrames) + videoReader.fillBuffer() + + while not videoReader.videoEnded(): + frameCount, frame = videoReader.pop() + frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) + for i, layer in enumerate(self.layers): + if i % 20 == 0: + print(f"filled {int(round(i/len(self.layers),2)*100)}% of all Layers") + + if layer.startFrame <= frameCount and layer.startFrame + len(layer.bounds) > frameCount: + data = [] + for (x, y, w, h) in layer.bounds[frameCount - layer.startFrame]: + if x is None: + break + factor = videoReader.w / self.resizeWidth + x = int(x * factor) + y = int(y * factor) + w = int(w * factor) + h = int(h * factor) + data.append(np.copy(frame[y:y+h, x:x+w])) + layer.data.append(data) + + videoReader.thread.join() def sortLayers(self): self.layers.sort(key = lambda c:c.startFrame) diff --git a/main.py b/main.py index 9478f59..c6dafd7 100644 --- a/main.py +++ b/main.py @@ -16,7 +16,7 @@ def demo(): config = Config() - config["inputPath"] = os.path.join(os.path.dirname(__file__), "generate test footage/3.mp4") + config["inputPath"] = os.path.join(os.path.dirname(__file__), "generate test footage/out.mp4") #config["importPath"] = os.path.join(os.path.dirname(__file__), "output/short.txt") config["outputPath"] = os.path.join(os.path.dirname(__file__), "output/short.mp4") @@ -29,7 +29,9 @@ def demo(): contours = ContourExtractor(config).extractContours() print("Time consumed extracting: ", time.time() - start) layerFactory = LayerFactory(config) + layers = layerFactory.extractLayers(contours) + layerFactory.fillLayers() else: layers = Importer(config).importRawData()