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 """