style and efficiency
This commit is contained in:
parent
19500fa3f5
commit
6d1359d27d
|
|
@ -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()
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue