使用flask可以制作自己的http服务,前端post发送request访问请求,同过base64编码图片传输至服务器端进行处理:图像检测识别等。
图像base64编码解码代码:
import base64
###np 图片编码成base64形式
def image_to_base64(image_mat):
image = cv2.imencode('.jpg', image_mat)[1]
image_code = str(base64.b64encode(image), 'utf-8')
return image_code
###base64图片解码成numpy图
def base64_to_image(imgBase64):
img_data = base64.b64decode(imgBase64)
bs = np.asarray(bytearray(img_data), dtype='uint8')
img = cv2.imdecode(bs, cv2.IMREAD_COLOR)
return img
Http服务端代码:
from tqdm import tqdm
import requests
import sys
import base64
import numpy as np
import cv2,os
from flask import Flask, request
import argparse
import json
app = Flask(__name__)
class RestHelper(object):
def __init__(self, data, id):
self.data = data
self.id = id
def toJson(self):
return {'status': '1', 'data': self.data, 'taskId':self.id}
def failure(self):
return {'status': '0','data': self.data, 'taskId':self.id}
def error(self):
return {'status': '0','data': self.data, 'taskId':self.id}
class dataEnconding(json.JSONEncoder):
def default(self, o):
#if isnumber(o):
# return str(o)
if isinstance(o, float):
return str(float(o))
if isinstance(o, int):
return str(o)
def proc(img):
pass
@app.route('/my_service', methods=["POST"])
def my_service():
print("------------my_service start----------------")
data = request.json
####接收到的信息
print("Request dict data key is: \n", data.keys(), type(data))
img = data["base64Img"]
##process img now-----
proc(img)
###process down
taskId=data["taskId"]
##服务返回结果信息------
q = RestHelper({"respose": "hello world!"}, id=taskId).toJson()
return json.dumps(q, cls=dataEnconding)
def parse_args():
parser = argparse.ArgumentParser(description='start service')
parser.add_argument('--port', '-p', default='4444', help='port')
parser.add_argument('--config', '-c', default='./iniFile/ini.cfg', help='rabbitMQ info')
args = parser.parse_args()
return args
if __name__ == '__main__':
args = parse_args()
port = args.port
print(port)
app.run(debug=False, host='0.0.0.0', port=port, threaded=False, processes=8)
发送访问请求:
from urllib import request, parse
import requests
import base64
import json
from urllib.request import urlretrieve
import os
import cv2
import base64
import numpy as np
import time
def image_to_base64(image_mat):
image = cv2.imencode('.jpg', image_mat)[1]
image_code = str(base64.b64encode(image), 'utf-8')
return image_code
if __name__ == '__main__':
url = "http://127.0.0.1:4444/my_service"
testImgp = "imgs/1.jpg"
img = cv2,imread(testImgp)
headers = {'content-type': "application/json"}
data = {
"taskId": 10086,
"base64Img":image_to_base64(img )
}
response = requests.post(url, json=json.loads(json.dumps(data)), headers=headers)
if response:
result = json.loads(str(response.content, 'utf-8'))
print(result)
也可以从headers中传入某些key value,在服务端使用request.headers.get(yourKEY)获取到
比如发送头
headers = {'content-type': "application/json", "taskId": taskId}
接受时候采用下面get key形式获取到值:
ID = str(request.headers.get('taskId'))