python-Flask编写一个简单的网络接口(3)--详解(超基础)图片传输

前言

这一章讲的只是一个小技巧而已,没有太多的知识内容。如果你自己百度的话也是可以查到的。话不多说。开始吧。我这次直接用案例讲吧。
(里面涉及到了一些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)

这样跑起来之后,嘿嘿。
我们先上传下这张图片试试

效果:
在这里插入图片描述

,,再试试别的
在这里插入图片描述
在这里插入图片描述
,,当然,不是所有的红色都能识别,,必须是阈值范围内的。。至于阈值怎么确定,你可以自己查查这方面的知识。(不难,设置非常的快的。)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值