最近遇到了一个很烧脑的问题,在机器视觉的检测模块部署到了服务器以后,python指令可以将指定文件夹中的图片进行识别并将检测结果保存到一个文件夹里,但是部署到了服务器以后我们不可能总是打开xftp7和xshell去将所需检测的照片放进去再python指令运行呀,如果能够打开一个代码运行,直接将本地想上传的图片进行一个参数包装传入,服务端收到请求再将检测后的结果反馈到本地岂不是方便太多了?
于是我找了很多博客和网站的方法,最终总结了一个简单且高效的图片上传下达的办法----base64
首先,写好server端代码结构:
import base64
from flask import Flask, request
import cv2
import numpy as np
import json
app = Flask(__name__)
'''
路由器端口api,传输方式POST
GET用于从服务器端获取数据,包括静态资源(HTML|JS|CSS|Image等等)、动态数据展示(列表数据、详情数据等等)。
POST用于向服务器提交数据,比如增删改数据,提交一个表单新建一个用户、或修改一个用户等。
'''
@app.route('/api',methods=['POST'])
def api():
#来捕捉客户端传来的数据
data = request.get_data().decode('utf-8')
#json.loads将string转换为dict
data = json.loads(data)
#获取dict中'img'标签的数据
image_b64 = data["img"]
#进行base64解码工作 base64->数组
image_decode = base64.b64decode(image_b64)
#fromstring实现了字符串到Ascii码的转换
nparr = np.fromstring(image_decode, np.uint8)
#从nparr中读取数据,并把数据转换(解码)成图像格式
img_np = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
cv2.imwrite('test.jpg',img_np)
return 'OK'
if __name__ == '__main__':
app.run(debug=True)
将server部署服务器后,在本地写好client代码段:
其实就相当于是将本地的一张图片选择后,进行了base64的编码转换,这个时候以编码形式传递到服务端,服务端接收后对base64编码进行解码,然后在服务器端就会自行保存成一张图片,这样就完成了一张图片的上传。
import base64
import requests
import json
url = 'http://127.0.0.1:5000/api'
f = open('1.png', 'rb')
#base64编码
base64_data = base64.b64encode(f.read())
f.close()
'''注意编码类型问题,byte->string '''
base64_data = base64_data.decode()
#传输的数据格式
data = {'img':base64_data}
#post传递数据
r = requests.post(url,data =json.dumps(data))
print(r.text)
以为看到这里就完了吗?
不不不,还有下达,既然上传好了,我们必然是要将检测的结果做一个下达的,那又如何下达呢?
原理其实是一样的,比如这里服务端将图片的编码解码后转化成了test.jpg,那么同理,将上面的服务端代码包装成一个函数,也就是def main():之类的自定义函数,然后找到检测后的图片名比如test.jpg,利用编码工具,转码,放到base64_data里头,然后把这个base64_data给return给这个自定义main函数,以反馈给客户端:return base64_data
if __name__=='__main__':
main()
创建运行就OK,解码函数如下:
import os, base64
with open("1.txt", "r") as f:
# str = "iVBORw0KGgoAAAANSUhEUgAAANwAAAAoCAIAAAAaOwPZAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAQuSURBVHhe7ZptmoMgDIR7rh6o5+lpvEwP01XUGshAokgX+8z+7PKRTF6SoN7e/KMCnSlw68wemkMF3oSSEHSnAKHsLiQ0iFCSge4UIJTdhYQGEUoy0J0ChLK7kNAgQkkGulOAUHYXEhpEKMlAdwpcG8rhcRv/HkN3stIgW4F88DYoX89nObjmANuOc0eMXpHHcyX9+mowhgHKmdlChM0BZzvzet6DSSW7xjEWk8Hu+/O1x7zF1237/Uu4t/O46V6sZuARoZb9KqbO7On4rJlykqcYYnNAjSbx3Gmrj6WTzxirVlA+90F82G+nm4fX3zOxgqyKqRaUU7b8FpRDOeyjJa7k5oByT1yWse4mxfDC3NrrprnQtQeUMuUXoURmCGHdKfl/oTS8MElxu2mudO0BXUCZL8efVGU0EmsQjkGpM2H8y/CwGtW1C3el8ywxhHKWxgOlaPNj0VcRRW+OoiKvCXF0o6YeXWLQDaNQyMf1Clhsi22D9HUNXOBCVZamaBmiO5BxRdRQOt3M3oFUAD4/HDolSChx7AvXzRIJQtgsUfMu6HB+HglNLc5d5KiwpcAqTH7Idk/lvLD9Z0rUx4vYWL2UJ4WY6XbdL91ML57+EjsRNEMnw/LCrKklN9NNkbuLvKsdabjM/ZMByh+PDWuuw6kDEYXPzeSfzGARlNG1M1ENRCfGLlUuJ5MVTg+UyxGzC+1+KN/DkDyuTSVbqo7vNnagfKPTrH9b8pQtgQ/PRCifDTaUJaIWw8adUycklLrcppkyCZfkJ5cYlSZnQTkmsYf58OYAlMpg6JnlhYlC9uxhIdWvbr1NS8Ahc9pgQlkkai3fOorVUK4JGeYTJIgVTm+mnCqrmSfOgDJ0mOlOlhcmClk3M0KmPzeF0mnDGVB6LjqbmKB8p5GRQ34DStRCdpEpp5MRNWRNocwsjk9i7nyqugzPYTWUSZuqe0qVucAT5tgH9ITmxEdCdihjpcCVAgfI8uJ4pgx3K3UhgBeRQ9dtbJmjp1TnYmsKoSH1UGqKE23mxlrsri4yKsuAFnZ5BrAugypw0/IdSvHmxHJbEI6lREzj0asuOc7TR8BONdd9pNKCo4LRNY9CdgCEXjqObDhQvsFpy7z7DsqHP9khxp9DzNeKbSR+Iy3/n31tqVFYe17xFUZkTu507+4px4USFwBRm32lbzFyXphgRMtn3cwqqaef8a0UrMHlaJYM8RC1Iq2DeOXvKUdVjALmzromST8+4N+Egm9rrwzl/DpAVlddnE9su36Jyx6ECtkUxufaUMJOzfwQsxldUbnTLyO/ckCcNsS112yDmkkGF/4xKL8rHndrowChbKMrV61QgFBWiMepbRQglG105aoVChDKCvE4tY0ChLKNrly1QgFCWSEep7ZRgFC20ZWrVihAKCvE49Q2ChDKNrpy1QoF/gDXIhmWmc+CSAAAAABJRU5ErkJggg=="
imgdata = base64.b64decode(f.read())
file = open('1.jpg', 'wb')
file.write(imgdata)
file.close()
这里的1.txt可以作为base64编码的保存,将这个编码传入也可以,1.txt里的内容我放到下面,大家可以创建1.txt 然后把编码复制进去保存 :
iVBORw0KGgoAAAANSUhEUgAAANwAAAAoCAIAAAAaOwPZAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAQuSURBVHhe7ZptmoMgDIR7rh6o5+lpvEwP01XUGshAokgX+8z+7PKRTF6SoN7e/KMCnSlw68wemkMF3oSSEHSnAKHsLiQ0iFCSge4UIJTdhYQGEUoy0J0ChLK7kNAgQkkGulOAUHYXEhpEKMlAdwpcG8rhcRv/HkN3stIgW4F88DYoX89nObjmANuOc0eMXpHHcyX9+mowhgHKmdlChM0BZzvzet6DSSW7xjEWk8Hu+/O1x7zF1237/Uu4t/O46V6sZuARoZb9KqbO7On4rJlykqcYYnNAjSbx3Gmrj6WTzxirVlA+90F82G+nm4fX3zOxgqyKqRaUU7b8FpRDOeyjJa7k5oByT1yWse4mxfDC3NrrprnQtQeUMuUXoURmCGHdKfl/oTS8MElxu2mudO0BXUCZL8efVGU0EmsQjkGpM2H8y/CwGtW1C3el8ywxhHKWxgOlaPNj0VcRRW+OoiKvCXF0o6YeXWLQDaNQyMf1Clhsi22D9HUNXOBCVZamaBmiO5BxRdRQOt3M3oFUAD4/HDolSChx7AvXzRIJQtgsUfMu6HB+HglNLc5d5KiwpcAqTH7Idk/lvLD9Z0rUx4vYWL2UJ4WY6XbdL91ML57+EjsRNEMnw/LCrKklN9NNkbuLvKsdabjM/ZMByh+PDWuuw6kDEYXPzeSfzGARlNG1M1ENRCfGLlUuJ5MVTg+UyxGzC+1+KN/DkDyuTSVbqo7vNnagfKPTrH9b8pQtgQ/PRCifDTaUJaIWw8adUycklLrcppkyCZfkJ5cYlSZnQTkmsYf58OYAlMpg6JnlhYlC9uxhIdWvbr1NS8Ahc9pgQlkkai3fOorVUK4JGeYTJIgVTm+mnCqrmSfOgDJ0mOlOlhcmClk3M0KmPzeF0mnDGVB6LjqbmKB8p5GRQ34DStRCdpEpp5MRNWRNocwsjk9i7nyqugzPYTWUSZuqe0qVucAT5tgH9ITmxEdCdihjpcCVAgfI8uJ4pgx3K3UhgBeRQ9dtbJmjp1TnYmsKoSH1UGqKE23mxlrsri4yKsuAFnZ5BrAugypw0/IdSvHmxHJbEI6lREzj0asuOc7TR8BONdd9pNKCo4LRNY9CdgCEXjqObDhQvsFpy7z7DsqHP9khxp9DzNeKbSR+Iy3/n31tqVFYe17xFUZkTu507+4px4USFwBRm32lbzFyXphgRMtn3cwqqaef8a0UrMHlaJYM8RC1Iq2DeOXvKUdVjALmzromST8+4N+Egm9rrwzl/DpAVlddnE9su36Jyx6ECtkUxufaUMJOzfwQsxldUbnTLyO/ckCcNsS112yDmkkGF/4xKL8rHndrowChbKMrV61QgFBWiMepbRQglG105aoVChDKCvE4tY0ChLKNrly1QgFCWSEep7ZRgFC20ZWrVihAKCvE49Q2ChDKNrpy1QoF/gDXIhmWmc+CSAAAAABJRU5ErkJggg==
我的博客个人下载资源里有很全面base64源码,大家可以下载下来慢慢研究 学习
好了,今天的分享就到这里了,本来想写很现成的东西的,但是作为算法设计者如果完全没有自己的思想套用现成的想必也没什么太大的意义,系统的思路提供结合自己真实的想法去设计,才是稳步前进的正轨。
Bye~