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