1.什么是Flask
- Flask是一个基于python开发并依赖于 jinja2 模板和 werkzeug WSGI 服务器的一个微型框架。
- 而werkzeug本质上是一个 socket 服务端,用于接收浏览器发送过来的请求,并进行预处理,然后再触发flask,这个时候我们就通过flask给我们提供的功能去对浏览器发送的请求做一个处理,当要处理的文件相对比较复杂时,则需要通过jinja2模板来处理,也就是我们常说的 渲染 ,之后再把处理过的数据返回给浏览器
学习链接:
2.通过Flask上传图片到服务器端(以原名保存)
server.py
from flask import request
from flask import Flask
import json
import numpy as np
import cv2
import base64
from gevent.pywsgi import WSGIServer
app = Flask(__name__)
# 定义路由
@app.route("/photo", methods=['POST'])
def get_frame():
# 接收图片
# upload_file = json.loads(request.json)
# print(upload_file['file'])
# upload_file=request.form['file']
filename=request.get_json()
print(filename)
# print(type(filename)=='str')
if (isinstance(filename,str)):
filname1=json.loads(filename)
tmp=filname1['file']
name=filname1['name']
img = base64.b64decode(str(tmp))
image_data = np.fromstring(img, np.uint8)
image_data = cv2.imdecode(image_data, cv2.IMREAD_COLOR)
cv2.imwrite('F:/pycharm/feature_match/face_result/{}'.format(name), image_data)
else:
tmp=filename['file']
img = base64.b64decode(str(tmp))
image_data = np.fromstring(img, np.uint8)
image_data = cv2.imdecode(image_data, cv2.IMREAD_COLOR)
cv2.imwrite('F:/pycharm/feature_match/face_result/1.jpg', image_data)
# fff=json.load(filename)
# print(upload_file)
# img=cv2.imread(tmp)
# cv2.imwrite("222.jpg",img)
# print(className,prob)
json_info = json.dumps(dic, ensure_ascii=False)
return json_info
if __name__ == "__main__":
dic = {}
app.run(host='10.16.55.26',port=9000)
## Serve the app with gevent
# http_server = WSGIServer(('0.0.0.1',5000),app)
# http_server.serve_forever()
client.py
import requests
import base64,glob
import json,cv2,os
import numpy as np
# API地址
url = "http://10.16.55.26:9000/photo"
# opencv读取出来的图片相当于numpy数组
def cv2_to_base64(image):
image1 = cv2.imencode('.jpg', image)[1]
image_code = str(base64.b64encode(image1))[2:-1]
return image_code
def base64_to_cv2(image_code):
#解码
img_data=base64.b64decode(image_code)
#转为numpy
img_array=np.fromstring(img_data,np.uint8)
#转成opencv可用格式
img=cv2.imdecode(img_array,cv2.COLOR_RGB2BGR)
return img
# with open(r'D:\pycharm\car_fee_system\images\result\2.jpg', 'rb') as f:
# img = base64.b64encode(f.read()).decode()
path=r'D:\pycharm\car_fee_system\images\result/'
images_paths = glob.glob(os.path.join(path + '*.jpg')) #*.jpg中的*,表示能匹配多个字符
for images_path in images_paths:
a,b= os.path.splitext(os.path.split(images_path)[1])
name=str(a)+str(b)
print(name)
image=cv2.imread(images_path)
image_code=cv2_to_base64(image)
image = []
image.append(image_code)
# 拼接参数
files = {'file': image,'name': name}
fff=json.dumps(files, ensure_ascii=False)
# 发送post请求到服务器端json.dumps(files, ensure_ascii=False)
# r = requests.post(url, json=json.dumps(files, ensure_ascii=False))
r = requests.post(url, json=fff)
print(r.status_code)
print(r.content)
print(type(json.dumps(files, ensure_ascii=False)))
client_camera.py
import requests
import base64,glob
import json,cv2,os
import numpy as np
# API地址
url = "http://10.16.55.26:9000/photo"
# opencv读取出来的图片相当于numpy数组
def cv2_to_base64(image):
image1 = cv2.imencode('.jpg', image)[1]
image_code = str(base64.b64encode(image1))[2:-1]
return image_code
def base64_to_cv2(image_code):
#解码
img_data=base64.b64decode(image_code)
#转为numpy
img_array=np.fromstring(img_data,np.uint8)
#转成opencv可用格式
img=cv2.imdecode(img_array,cv2.COLOR_RGB2BGR)
return img
# with open(r'D:\pycharm\car_fee_system\images\result\2.jpg', 'rb') as f:
# img = base64.b64encode(f.read()).decode()
# frame 就是每一帧图像,是个三维矩阵
# 参数是0,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频
capture = cv2.VideoCapture(0)
ret, frame = capture.read()
a='cemare1'
b=1
while ret:
b+=1
if b%5==0:
ret, frame = capture.read()
name=str(a)+'-'+str(b)
image_code=cv2_to_base64(frame)
image = []
image.append(image_code)
# 拼接参数
files = {'file': image,'name': name}
fff=json.dumps(files, ensure_ascii=False)
# 发送post请求到服务器端json.dumps(files, ensure_ascii=False)
# r = requests.post(url, json=json.dumps(files, ensure_ascii=False))
r = requests.post(url, json=fff)
print('200为成功 500为失败',r.status_code)
print('正在上传第{}张图片,图片名为{}'.format(b,name))
# print(r.content)
# print(type(json.dumps(files, ensure_ascii=False)))