shikibu9419's picture
Add production codes
f1d6080
raw
history blame
3.48 kB
from flask import Flask, request, jsonify, render_template, make_response
from flask_cors import CORS
import numpy as np
import cv2
from src.color_controls import control_kelvin, control_contrast, control_HSV
from src.cyano import Cyanotype
from src.prediction import predict_img, optimize_img, update_patch
from src.utils import cv_to_pil, pil_to_cv
UPLOAD_FOLDER = './uploads'
app = Flask(__name__, template_folder='/client', static_folder='/client')
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
CORS(
app,
supports_credentials=True
)
@app.route('/api/process', methods=['POST'])
def process():
imgfile = request.files['img']
img_array = np.asarray(bytearray(imgfile.stream.read()), dtype=np.uint8)
img = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
data = request.form
hue = int(data["hue"])
saturation = float(data["saturation"])
lightness = float(data["lightness"])
contrast = int(data["contrast"])
kelvin = int(data["kelvin"])
img = control_contrast(img, contrast)
img = control_HSV(img, hue, saturation, lightness)
img_pil = cv_to_pil(img)
img_pil = control_kelvin(img_pil, kelvin)
img = pil_to_cv(img_pil)
response = make_response(cv2.imencode('.png', img)[1].tobytes())
response.headers.set('Content-Type', 'image/png')
return response
@app.route('/api/predict/<process_name>', methods=['POST'])
def predict(process_name):
if not process_name in ['cyanotype_mono', 'cyanotype_full', 'salt', 'platinum']:
return jsonify({ 'error': 'process name is invalid' })
imgfile = request.files['img']
img_array = np.asarray(bytearray(imgfile.stream.read()), dtype=np.uint8)
img = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
if 'colorpatch' in request.files:
patchfile = request.files['colorpatch']
patch_array = np.asarray(bytearray(patchfile.stream.read()), dtype=np.uint8)
colorpatch = cv2.imdecode(colorpatch_array, cv2.IMREAD_COLOR)
update_patch(process_name, colorpatch)
img = predict_img(process_name, img)
response = make_response(cv2.imencode('.png', img)[1].tobytes())
response.headers.set('Content-Type', 'image/png')
return response
@app.route('/api/optimize/<process_name>', methods=['POST'])
def optimize(process_name):
if not process_name in ['cyanotype_mono', 'cyanotype_full', 'salt', 'platinum']:
return jsonify({ 'error': 'process name is invalid' })
imgfile = request.files['img']
img_array = np.asarray(bytearray(imgfile.stream.read()), dtype=np.uint8)
img = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
if 'colorpatch' in request.files:
patchfile = request.files['colorpatch']
patch_array = np.asarray(bytearray(patchfile.stream.read()), dtype=np.uint8)
colorpatch = cv2.imdecode(colorpatch_array, cv2.IMREAD_COLOR)
update_patch(process_name, colorpatch)
(opt_img, preview_img) = optimize_img(process_name, img)
h, w = preview_img.shape[:2]
if process_name.endswith('full'):
opt_img = np.reshape(opt_img, (h, w, 3))
else:
opt_img = np.reshape(opt_img, (h, w, 1))
opt_img = np.array([[[i[0]] * 3 for i in j] for j in opt_img], dtype=np.uint8)
img = cv2.hconcat([opt_img, preview_img])
response = make_response(cv2.imencode('.png', img)[1].tobytes())
response.headers.set('Content-Type', 'image/png')
return response
if __name__ == "__main__":
app.run(debug=True, port=8000)