import sys import cv2 import numpy as np from json import load from os.path import exists, basename from common import image_resize, display, read_json holeConstant = .0156862745 # 160/10200 # use top left, top right, bottom left def apply_image_to_points (original, target, points) : rows, cols, ch = original.shape ir, ic, ich = target.shape print('Using points: ') print(points) atPts = np.float32(points) targetPts = np.float32([[0, 0], [ic, 0], [0, ir]]) M = cv2.getAffineTransform(targetPts, atPts) dst = cv2.warpAffine(target, M, (cols, rows)) #, borderMode=cv2.BORDER_TRANSPARENT original[0:rows, 0:cols] = dst #return original return cv2.cvtColor(original, cv2.COLOR_BGR2BGRA) def create_blank(width, height): rgb_color=(255,255,255) image = np.zeros((height, width, 3), np.uint8) color = tuple(reversed(rgb_color)) image[:] = color #return image return cv2.cvtColor(image, cv2.COLOR_BGR2BGRA) # get points 0, 1 and 3 = top left, top right and bottom left def to_points (d) : return [[d['0']['x'], d['0']['y']], [d['1']['x'], d['1']['y']], [d['3']['x'], d['3']['y']]] if len(sys.argv) < 2 : print('Please provide an output destination file') exit(1) outputFile = sys.argv[1] if len(sys.argv) < 3: print('Please provide a calibration template to apply images to') exit(2) templateFile = sys.argv[2] if not exists(templateFile) : print('Calibration template does not exist, please provide one that does') exit(3) if len(sys.argv) < 4: print('Please provide at least one image to apply') exit(4) if len(sys.argv) > 7: print('Please provide maximum four images to apply') exit(5) images = [] for i in range(3, len(sys.argv)): imagePath = sys.argv[i] if not exists(imagePath) : print(f'Image {imagePath} does not exist, exiting...') exit(6) images.append(imagePath) print('Using images: ') for img in images: print(f' -> {basename(img)}') tmpl = read_json(templateFile) print(f"Image size {tmpl['width']}x{tmpl['height']}") hole = round(tmpl['width'] * holeConstant) blank = create_blank(tmpl['width'], tmpl['height']) output = blank.copy() # #output = cv2.imread(templateFile.replace('.calibration.json', '')) hp = tmpl['holePunches'] for i in hp: print(hp[i]) cv2.circle(output, (hp[i]['x'], hp[i]['y'],), hole, (0, 0, 0,), -1) #cv2.imwrite(outputFile, output) #for i in range(0, len(images)) : # frame = cv2.imread(images[i]) # frame = cv2.cvtColor(frame, cv2.COLOR_RGB2RGBA) # cv2.imwrite(f'test{i}.png', output) # output = apply_image_to_points(output, frame, to_points(tmpl[f'{i}'])) # print(f'Applied {basename(images[i])}') target = cv2.imread(images[0]) target = cv2.cvtColor(target, cv2.COLOR_BGR2BGRA) points = to_points(tmpl['0']) rows, cols, ch = output.shape ir, ic, ich = target.shape print('Using points: ') print(points) atPts = np.float32(points) targetPts = np.float32([[0, 0], [ic, 0], [0, ir]]) M = cv2.getAffineTransform(targetPts, atPts) dst = cv2.warpAffine(target, M, (cols, rows), flags = cv2.INTER_CUBIC, borderMode = cv2.BORDER_CONSTANT, borderValue = [0, 0, 0, 0]) #mask = cv2.inRange(dst, [0, 0, 0, 0], [0, 0, 0, 0]) output[0:rows, 0:cols] = dst display(output) #cv2.imwrite(outputFile, output) ##print(f'Wrote {outputFile}')