Flask image post

Send an image to web service to process and return an image

SERVER SIDE

from flask import Flask, request, send_file

import cv2

from PIL import Image

from io import BytesIO

app = Flask(__name__)

@app.route('/detect', methods=['POST'])

def detect():

    req = request

    # convert string of image data to uint8

    np_array = np.fromstring(req.data, np.uint8)

    # decode image

    img = cv2.imdecode(np_array, cv2.IMREAD_COLOR)

    #pil image instance

    img = Image.fromarray(img)

    

    '''do sth on the img'''

    #save pil image to BytesIO in memory

    #quality 1 - 95, default is 75

    img_io = BytesIO()

    img.save(img_io, 'JPEG', quality = 95)

    img_io.seek(0)

     

    return send_file(img_io, mimetype='image/jpeg')

CLIENT SIDE

import requests

import cv2

from io import BytesIO

from PIL import Image

url = 'http://bla.bla'

content_type = 'image/jpeg'

headers = {'content-type': content_type}

img = cv2.imread('c:/Temp/abc.jpg')

_, img_encoded = cv2.imencode('.jpg', img)

response = requests.post(detect_url, data=img_encoded.tostring(), headers=headers)

img_io = BytesIO(response.content)

img_io.seek(0)

image = Image.open(img_io)

image.show()

ALtertively, it doesn't need cv2 to encode or decode the image. Above leave the cv2 in for e.g. further image processing using cv2.

def post_image(img_file):

    """ post image and return the response """

    img = open(img_file, 'rb').read()

    response = requests.post(URL, data=img, headers=headers)

    return response