提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
最近在做项目的时候遇到了如下场景:C++编写的图像识别程序已经通过测试,需要编写一个python程序来调用C++程序,并且需要暴露一个接口给终端,response直接返回识别后的图像。
提示:以下是本篇文章正文内容,下面案例可供参考
一、python程序
思路:直接利用flask写接口,先写一个接口测试调用C++程序是否有正常返回,再写一个接口将图片转base64并放入responseBody中。
代码如下:
import base64
import io
import subprocess
from subprocess import PIPE
from flask import*import cv2
app = Flask(__name__, template_folder="templates", static_folder="static")
app.config["SECRET_KEY"]='TPmi4aLWRbyVq8zu9v82dWYW1'@app.route('/meterRead', methods=['POST','GET'])defmeter_read():# t = GetSellThread()# t.start()
a ="det_model.xml"
b ="seg_model.xml"
c = request.args.get("imgPath")
d = request.args.get("unit")
e ="60.0"# ./meter_reader det_model.xml seg_model.xml ../data/m15.jpg 2.0 60.0
s = subprocess.run(["./meter_reader", a, b, c, d, e], stdout=PIPE)print(s)return s.stdout.decode("utf-8")@app.route('/resultImg')defmeter_img():
a ="det_model.xml"
b ="seg_model.xml"
c = request.args.get("imgPath")
d = request.args.get("unit")
e ="60.0"# ./meter_reader det_model.xml seg_model.xml ../data/m15.jpg 2.0 60.0
s = subprocess.run(["./meter_reader", a, b, c, d, e], stdout=PIPE)print(s)# image = cv2.imread("./results.jpg")# resp = make_response(image)# byte_stream = io.BytesIO(image)
base64img = get_picture_base64_data("./results.jpg")
resp = make_response(base64img)# resp.headers['Content-Type'] = 'image/jpeg'return resp
defget_picture_base64_data(image_path):withopen(image_path,'rb')as img_obj:
base64_data = base64.b64encode(img_obj.read())return base64_data
if __name__ =='__main__':
app.run(threaded=False, debug=True, port=8000, host="0.0.0.0")
二、postman进行接口测试
模拟终端输入参数,并将其填入param中,编写一下js脚本写入Tests中:
// 将接口返回数据,封装成自己需要的结构var data ={response: pm.response.body
}// html 模板字符var template =`<html><img src="data:image/jpg;base64,{{response}}" /></html>`;// 设置 visualizer 数据。传模板、解析对象。
pm.visualizer.set(template, data);
点击Send,执行效果如下:
要点总结
1.调用C++程序需要使用subprocess.run([“./meter_reader”, a, b, c, d, e], stdout=PIPE)这种拼接语句写法。
2.图片传输形式要想好是字节流还是base64的形式,并有对应的encode和decode方法。
3.数据放入response之后,要知道所需数据在其中的那个部分,header还是body,body是json形式的还是直接编码形式的。在写postman的tests脚本时,要注意data中为需要转换的直接内容,要搞清楚是response.json.xx还是response.body,template中标签渲染的内容为data中取名内容。
版权归原作者 管田将军不管饱 所有, 如有侵权,请联系我们删除。