new0808 / hm-scipt /merger.py
dikdimon's picture
Upload hm-scipt using SD-Hub extension
00dd817 verified
import cv2
import os
import numpy as np
import random
framePath = 'frames'
maskPath = 'masks'
os.path.exists(framePath) or os.mkdir(framePath)
os.path.exists(maskPath) or os.mkdir(maskPath)
maskedFrames = []
for f in os.listdir(framePath):
if os.path.exists(os.path.join(maskPath,f+'.npy')):
maskedFrames.append( (os.path.join(maskPath,f+'.npy'),os.path.join(framePath,f)) )
random.shuffle(maskedFrames)
print(maskedFrames)
cw,ch = 1024,1024*2
placedFrames = []
canvas = np.zeros((cw,ch,3),np.uint8)
px,py = 0,0
placed = False
changezoom=0
def drawBlock(event,x,y,flags,param):
global placed,px,py,changezoom
if event==cv2.EVENT_LBUTTONDOWN:
px=x
py=y
placed=True
elif event==cv2.EVENT_MOUSEMOVE:
px=x
py=y
elif event==cv2.EVENT_MOUSEWHEEL:
if flags>0:
changezoom = 1
else:
changezoom = -1
cv2.namedWindow('canvas')
cv2.setMouseCallback('canvas',drawBlock)
qpressed=False
for maskPath,framePath in maskedFrames:
if qpressed:
break
factor = 4
frameo = cv2.imread(framePath)
frame = cv2.resize(frameo,None,fx=1/factor,fy=1/factor,interpolation=cv2.INTER_AREA)
maskRect = np.load(maskPath)/factor
xo,yo = np.mean( maskRect,axis=0)
xo = int(xo)
yo = int(yo)
while 1:
tempCanvas = canvas.copy()
if changezoom != 0:
factor += changezoom/10
if factor<1:
factor = 1
changezoom=0
frame = cv2.resize(frameo,None,fx=1/factor,fy=1/factor,interpolation=cv2.INTER_AREA)
maskRect = (np.load(maskPath)/factor).astype(int)
xo,yo = np.mean( maskRect,axis=0)
xo = int(xo)
yo = int(yo)
for _,lastmr,x,y,h,w in placedFrames:
cv2.rectangle(tempCanvas, (x,y), ((x+h,y+w)), (10,10,10), -1)
for _,lastmr,x,y,h,w in placedFrames:
tempPoints = np.array(lastmr,np.int32)
tempPoints.reshape((-1, 1, 2))
cv2.polylines(tempCanvas,[tempPoints],True,(100,100,100))
tempPoints = np.array(maskRect,np.int32)+(px-xo,py-yo)
tempPoints.reshape((-1, 1, 2))
cv2.rectangle(tempCanvas, (px-xo,py-yo), ((px-xo+frame.shape[1],py-yo+frame.shape[0])), (50,50,50), 2)
cv2.polylines(tempCanvas,[tempPoints],True,(255,0,255))
cv2.imshow('canvas',tempCanvas)
k = cv2.waitKey(1)
if k == ord('q'):
qpressed=True
break
if placed:
placedFrames.append( (frame,maskRect+(px-xo,py-yo),px-xo,py-yo,frame.shape[1],frame.shape[0]) )
placed=False
break
subdiv = cv2.Subdiv2D((0,0,ch,cw))
for _,lastmr,_,_,_,_ in placedFrames:
for px,py in lastmr:
print('point',px,py)
subdiv.insert((px,py))
facetList,facetCentres = subdiv.getVoronoiFacetList([])
tempCanvas = canvas.copy()
indexToFacets = {}
minx,maxx = float('inf'),float('-inf')
miny,maxy = float('inf'),float('-inf')
coordToIndex = {}
for i,(_,lastmr,_,_,_,_) in enumerate(placedFrames):
for px,py in lastmr:
coordToIndex[(px,py)] = i
canvas = np.zeros((cw,ch,3),np.uint8)
for facet,(cx,cy) in zip(facetList,facetCentres):
minx = min(minx,cx)
miny = min(miny,cy)
maxx = max(maxx,cx)
maxy = max(maxy,cy)
tempPoints = np.array(facet,np.int32)
tempPoints.reshape((-1, 1, 2))
cv2.polylines(canvas,[tempPoints],True,(100,100,100))
cv2.imshow('canvas',canvas)
k = cv2.waitKey(1)
matchIndex = coordToIndex.get((cx,cy))
if matchIndex is not None:
indexToFacets.setdefault(matchIndex,[]).append(facet)
else:
print('NOMATCH')
canvas = np.zeros((cw,ch,3),np.uint8)
for i,(frame,_,px,py,_,_) in enumerate(placedFrames):
facets = indexToFacets[i]
source = np.zeros((cw,ch,3),np.uint8)
mask = np.zeros((cw,ch,3),np.uint8)
maxh = frame.shape[0]
if maxh > source.shape[0]-py:
maxh = source.shape[0]-py
maxw = frame.shape[1]
if maxw > source.shape[1]-px:
maxw = source.shape[1]-px
source = cv2.resize(frame,(source.shape[1],source.shape[0]))
source = cv2.GaussianBlur(source,(515,515),cv2.BORDER_DEFAULT)
source[py:py+maxh,px:px+maxw,:]=frame[:maxh,:maxw,:]
for facet in facets:
tempPoints = np.array(facet,np.int32)
tempPoints.reshape((-1, 1, 2))
cv2.fillPoly(mask,[tempPoints],(255,255,255))
foreground = source.astype(float)
background = canvas.astype(float)
mask = cv2.medianBlur(mask,27,cv2.BORDER_DEFAULT)
mask = cv2.blur(mask,(37,37),cv2.BORDER_DEFAULT)
mask = mask.astype(float)/255
foreground = cv2.multiply(mask, foreground)
background = cv2.multiply(1.0 - mask, background)
canvas = cv2.add(foreground, background).astype(np.uint8)
cv2.imshow('canvas',canvas)
k = cv2.waitKey(1)
print(minx,maxx,miny,maxy)
minx,maxx,miny,maxy = int(minx),int(maxx),int(miny),int(maxy)
canvas = canvas[miny:maxy,minx:maxx,:]
cv2.imshow('canvas',canvas)
k = cv2.waitKey(0)
import time
cv2.imwrite(str(time.time())+'.png', canvas)
"""
cv2.imshow('canvas',tempCanvas)
k = cv2.waitKey(100)
if k == ord('q'):
break
"""