style and efficiency

This commit is contained in:
Askill 2022-01-02 23:40:05 +01:00
parent 19500fa3f5
commit 6d1359d27d
5 changed files with 55 additions and 50 deletions

View File

@ -1,3 +1,4 @@
from Application.Config import Config
from Application.Layer import Layer from Application.Layer import Layer
from Application.VideoReader import VideoReader from Application.VideoReader import VideoReader
from datetime import datetime from datetime import datetime
@ -82,6 +83,7 @@ class Exporter:
maxLength = self.getMaxLengthOfLayers(layers) maxLength = self.getMaxLengthOfLayers(layers)
underlay = cv2.VideoCapture(self.footagePath).read()[1] underlay = cv2.VideoCapture(self.footagePath).read()[1]
underlay = cv2.cvtColor(underlay, cv2.COLOR_BGR2RGB) underlay = cv2.cvtColor(underlay, cv2.COLOR_BGR2RGB)
#underlay = np.zeros(shape=[videoReader.h, videoReader.w, 3], dtype=np.uint8)
frames = [] frames = []
for i in range(maxLength): for i in range(maxLength):
frames.append(np.copy(underlay)) frames.append(np.copy(underlay))
@ -99,33 +101,35 @@ class Exporter:
for layer in layers: for layer in layers:
if layer.startFrame <= frameCount and layer.startFrame + len(layer.bounds) > frameCount: if layer.startFrame <= frameCount and layer.startFrame + len(layer.bounds) > frameCount:
for i in range(0, len(layer.bounds[frameCount - layer.startFrame])): for i in range(0, len(layer.bounds[frameCount - layer.startFrame])):
underlay1 = underlay try:
(x, y, w, underlay1 = underlay
h) = layer.bounds[frameCount - layer.startFrame][i] (x, y, w,
mask = layer.masks[frameCount - layer.startFrame][i] h) = layer.bounds[frameCount - layer.startFrame][i]
if x is None: mask = layer.masks[frameCount - layer.startFrame][i]
break if x is None:
factor = videoReader.w / self.resizeWidth break
x, y, w, h = (int(x * factor), int(y * factor), factor = videoReader.w / self.resizeWidth
int(w * factor), int(h * factor)) 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)
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.thread.join()
videoReader.vc.release() videoReader.vc.release()

View File

@ -88,7 +88,7 @@ class Layer:
overlap = False overlap = False
maxLen = min(len(layer2.bounds), len(self.bounds)) maxLen = min(len(layer2.bounds), len(self.bounds))
bounds = self.bounds[:maxLen] 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 b1 in b1s:
for b2 in b2s: 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])): 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): def timeOverlaps(self, layer2):
'''Checks for overlap in time between current and given layer''' '''Checks for overlap in time between current and given layer'''
s1 = self.startFrame s1 = self.exportOffset
e1 = self.lastFrame e1 = self.lastFrame - self.startFrame + self.exportOffset
s2 = layer2.startFrame s2 = self.exportOffset
e2 = layer2.lastFrame e2 = layer2.lastFrame - layer2.startFrame + self.exportOffset
if s2 >= s1 and s2 <= e1: if s2 >= s1 and s2 <= e1:
return True return True

View File

@ -125,7 +125,7 @@ class LayerFactory:
merge.add(indexes[lc2]) merge.add(indexes[lc2])
merge = list(merge) merge = list(merge)
if len(merge) > 1: if len(merge) > 1:
self.mergeLayers(megre) self.mergeLayers(merge)
i = innerMax i = innerMax
def getPossibleLayers(self, t): def getPossibleLayers(self, t):

View File

@ -8,6 +8,7 @@ import cv2
import numpy as np import numpy as np
import time import time
class LayerManager: class LayerManager:
def __init__(self, config, layers): def __init__(self, config, layers):
self.data = {} self.data = {}
@ -29,7 +30,7 @@ class LayerManager:
self.freeMin() self.freeMin()
print("Before deleting long layers ", len(self.layers)) print("Before deleting long layers ", len(self.layers))
self.freeMax() self.freeMax()
self.sortLayers() self.sortLayers()
self.calcStats() self.calcStats()
print("Before deleting sparse layers ", len(self.layers)) print("Before deleting sparse layers ", len(self.layers))
self.deleteSparse() self.deleteSparse()
@ -55,14 +56,14 @@ class LayerManager:
layers = [] layers = []
for l in self.layers: for l in self.layers:
if len(l) > self.minLayerLength: if len(l) > self.minLayerLength:
layers.append(l) layers.append(l)
self.layers = layers self.layers = layers
def freeMax(self): def freeMax(self):
layers = [] layers = []
for l in self.layers: for l in self.layers:
if len(l) < self.maxLayerLength: if len(l) < self.maxLayerLength:
layers.append(l) layers.append(l)
self.layers = layers self.layers = layers
def tagLayers(self): def tagLayers(self):
@ -71,7 +72,8 @@ class LayerManager:
exporter = Exporter(self.config) exporter = Exporter(self.config)
start = time.time() start = time.time()
for i, layer in enumerate(self.layers): 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() start = time.time()
if len(layer.bounds[0]) == 0: if len(layer.bounds[0]) == 0:
continue continue
@ -101,23 +103,22 @@ class LayerManager:
videoReader.thread.join() videoReader.thread.join()
def sortLayers(self): def sortLayers(self):
self.layers.sort(key = lambda c:c.startFrame) self.layers.sort(key=lambda c: c.startFrame)
def calcTimeOffset(self): def calcTimeOffset(self):
lenL = len(self.layers)
for i, layer in enumerate(self.layers): for i, layer in enumerate(self.layers):
print(
f"\r {i}/{lenL}", end='\r')
overlap = True overlap = True
while overlap: while overlap:
overlap = False overlap = False
for l in self.layers[i:]: for l in self.layers[:i:-1]:
if layer.timeOverlaps(l): if layer.timeOverlaps(l) and layer.spaceOverlaps(l):
if layer.spaceOverlaps(l): overlap = True
overlap = True break
if overlap: if overlap:
self.addDelay(i, 10) self.layers[i].exportOffset += 20
if self.layers[i].exportOffset >= 180:
break
def addDelay(self, index, frames): if self.layers[i].exportOffset >= 30000:
for layer in self.layers[index:]: break
layer.exportOffset += frames

View File

@ -15,7 +15,7 @@ def main():
startTotal = time.time() startTotal = time.time()
config = Config() config = Config()
fileName = "x23-1.mp4" fileName = "x23.mp4"
outputPath = os.path.join(os.path.dirname(__file__), "output") outputPath = os.path.join(os.path.dirname(__file__), "output")
dirName = os.path.join(os.path.dirname(__file__), "generate test footage") dirName = os.path.join(os.path.dirname(__file__), "generate test footage")