前言
这一章讲的只是一个小技巧而已,没有太多的知识内容。如果你自己百度的话也是可以查到的。话不多说。开始吧。我这次直接用案例讲吧。
(里面涉及到了一些opencv的东西,如果无法理解也不用强行理解)
实现图片上传和下传
首先,我们要想办法先拿到上传的图片
这个简单,直接调用接口就可以了
@app.route('/img/send_img', methods=['POST'])
def send_img():
f = request.files['my_img'] # 拿到请求的文件中name是my_img的文件
img = f.read() # 类似于你打开本地文件的读取
这样你就可以拿到上传的图片啦。
然后我们再试试把图片下传
emmm就直接把收到的图片传回去吧
@app.route('/img/send_img', methods=['POST'])
def send_img():
f = request.files['my_img']
img = f.read()
# im1 = cv2.imdecode(np.frombuffer(img, np.uint8), cv2.IMREAD_COLOR)
resp = make_response(img)
# 设置response的headers对象
resp.headers['Content-Type'] = 'image/jpeg' # 表明传输类型是图片
return resp
嘿嘿,写好了,就是这么简单。接下来测试下。
emmm,,因为我没安POSTMAN,,就直接写个from表单吧。
<body>
<form action="http://127.0.0.1:80/img/send_img" method="post" enctype="multipart/form-data" name="upload_form">
<label>选择图片文件</label>
<input name="my_img" type="file" accept="image/gif, image/jpeg"/>
<input name="upload" type="submit" value="上传" />
</form>
</body>
,然后俩边跑起来
然后上传图片!
这就是效果啦。怎么样,,是不是很简单?
课后骚操作
嘿嘿,上次和你说了,有不少骚操作,今天就和你表演一下,嘿嘿。
案例需求
写一个图片处理的接口,要求能够找到你上传的图片中有红色的地方变成白色,其他地方为黑色。
(这其实涉及到了opencv了,我这里为了方便只写了个简单的,emmm,,点到为止,因为我目前想到的关于图片的而且还很基础的好像就这一个。)
我提的这个需求你可能觉得实际中不会用到。。。那是因为我这里为了以falsk为主。我提的这个需求其实是从机器识别中比较基础的颜色识别简化来的。(就是那种,给机器人一个堆不同颜色的球,然后机器人可以把你设定的颜色的球挑选出来)。
代码实现
我把图片处理的代码贴出来,但是我不会解释的很详细,大致注释里说下吧。
import numpy as np
import cv2
image = cv2.imread("12.png") # 读取
# 设置颜色阈值(主要是根据不同的值来识别不同的颜色,具体你可以百度查查。我这个值来是红色的)
lower = [17, 15, 100]
upper = [50, 56, 200]
lower = np.array(lower, dtype = "uint8")
upper = np.array(upper, dtype = "uint8")
# 阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0)
mask = cv2.inRange(image, lower, upper)
cv2.imshow('result', mask ) #展示出来
cv2.waitKey(0)
本地的叫12.png的文件长这样(我从别人博客上弄来的图。。因为他的博客有阈值和对应的内容,所以为了偷懒我直接从他那里拿的阈值和图片。图片来源博客链接)
跑起来,就是这样
,,红色的部分,变成白色了。
然后再结合我们上面的图片接口的代码,就可以:
from flask import Flask,request,jsonify, make_response
import cv2
import numpy as np
import json
from PIL import Image
from io import BytesIO
app = Flask(__name__)
@app.route('/img/send_img', methods=['POST'])
def send_img():
f = request.files['my_img']
img = f.read()
image = cv2.imdecode(np.frombuffer(img, np.uint8), cv2.IMREAD_COLOR)
# image = cv2.imread("12.png") # 读取
# 设置颜色阈值(主要是根据不同的值来识别不同的颜色,具体你可以百度查查。我这个值来是红色的)
lower = [17, 15, 100]
upper = [50, 56, 200]
lower = np.array(lower, dtype="uint8")
upper = np.array(upper, dtype="uint8")
# 阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0)
mask = cv2.inRange(image, lower, upper)
img_pil = Image.fromarray(mask )
img_byte = BytesIO()
img_pil.save(img_byte, format='JPEG') # format: PNG or JPEG
binary_content = img_byte.getvalue() # im对象转为二进制流
resp = make_response(binary_content)
# 设置response的headers对象
resp.headers['Content-Type'] = 'image/jpeg'
# resp.headers['image-focus'] = image_focus
return resp
if __name__ == '__main__':
app.run(debug=True, port=80)
这样跑起来之后,嘿嘿。
我们先上传下这张图片试试
效果:
,,再试试别的
,,当然,不是所有的红色都能识别,,必须是阈值范围内的。。至于阈值怎么确定,你可以自己查查这方面的知识。(不难,设置非常的快的。)