| import json |
| from flask import Flask |
| from flask_cors import CORS |
|
|
| from PIL import Image |
| import numpy as np |
| import potrace |
| import cv2 |
| import os |
| import sys |
| import traceback |
| import multiprocessing |
|
|
|
|
| app = Flask(__name__) |
| CORS(app) |
|
|
| |
| FRAME_DIR = 'frames' |
| frame_latex = 0 |
|
|
|
|
| def png_to_np_array(filename): |
| img = Image.open(filename) |
| data = np.array(img.getdata()).reshape(img.size[1], img.size[0], 3) |
| bindata = np.zeros((img.size[1], img.size[0]), np.uint32) |
| for i, row in enumerate(data): |
| for j, byte in enumerate(row): |
| bindata[img.size[1]-i-1, j] = 1 if sum(byte) < 127*3 else 0 |
| |
| |
| return bindata |
|
|
| def png_to_svg(filename): |
| data = png_to_np_array(filename) |
| bmp = potrace.Bitmap(data) |
| path = bmp.trace() |
| return path |
|
|
| frame_coords = [] |
|
|
| def gefd(frame_latexs): |
| for i in range(frame_latexs): |
|
|
| latex = [] |
|
|
| path = png_to_svg('frames/frame%d.png' % (i+1)) |
|
|
| for curve in path.curves: |
| segments = curve.segments |
| start = curve.start_point |
| for segment in segments: |
| x0, y0 = start |
| if segment.is_corner: |
| x1, y1 = segment.c |
| x2, y2 = segment.end_point |
| latex.append('((1-t)%f+t%f,(1-t)%f+t%f)' % (x0, x1, y0, y1)) |
| latex.append('((1-t)%f+t%f,(1-t)%f+t%f)' % (x1, x2, y1, y2)) |
| else: |
| x1, y1 = segment.c1 |
| x2, y2 = segment.c2 |
| x3, y3 = segment.end_point |
| latex.append('((1-t)((1-t)((1-t)%f+t%f)+t((1-t)%f+t%f))+t((1-t)((1-t)%f+t%f)+t((1-t)%f+t%f)),\ |
| (1-t)((1-t)((1-t)%f+t%f)+t((1-t)%f+t%f))+t((1-t)((1-t)%f+t%f)+t((1-t)%f+t%f)))' % \ |
| (x0, x1, x1, x2, x1, x2, x2, x3, y0, y1, y1, y2, y1, y2, y2, y3)) |
| start = segment.end_point |
|
|
| frame_coords.append(latex) |
|
|
| @app.route('/') |
| def index(): |
| return json.dumps(frame_coords) |
|
|
| @app.route('/app') |
| def app_(): |
| return render_template('index.html') |
|
|
| if __name__ == '__main__': |
| frame_latex = range(len(os.listdir(FRAME_DIR))) |
| with multiprocessing.Pool(processes = multiprocessing.cpu_count()) as pool: |
| print('Processing %d frames... Please wait for processing to finish before running on frontend\n' % len(os.listdir(FRAME_DIR))) |
|
|
| try: |
| frame_latex = pool.map(gefd, frame_latex) |
| except cv2.error as e: |
| print('[ERROR] Unable to process one or more files. Remember image files should be named <DIRECTORY>/frame<INDEX>.<EXTENSION> where INDEX represents the frame number starting from 1 and DIRECTORY and EXTENSION are defined by command line arguments (e.g. frames/frame1.png). Please check if:\n\tThe files exist\n\tThe files are all valid image files\n\tThe name of the files given is correct as per command line arguments\n\tThe program has the necessary permissions to read the file.\n\nUse backend.py -h for further documentation\n') |
|
|
| print('-----------------------------') |
|
|
| print('Full error traceback:\n') |
| traceback.print_exc() |
| sys.exit(2) |
| |
| app.run() |