在本系列的(一)已经教过大家如何使用树莓派建立与Flask项目的通信,这里给大家进一步优化代码,实现服务端往Flask页面传输图像
1.服务端(树莓派)
import cv2
import requests
import base64
from io import BytesIO
import time
def capture_frame_and_send(text):
cap = cv2.VideoCapture(0) # 使用摄像头
ret, frame = cap.read()
cap.release()
if ret:
# 将帧转换为JPEG格式
_, buffer = cv2.imencode('.jpg', frame)
img_str = base64.b64encode(buffer)
# 发送请求到 Flask 服务器,上传图片
response_image = requests.post(
'http://192.168.137.1:5000/upload-image',
files={'image': ('image.jpg', BytesIO(img_str), 'image/jpeg')}
)
print(f'Image Status: {response_image.status_code}, Response: {response_image.text}')
# 发送文本数据到 Flask 服务器
response_text = requests.post(
'http://192.168.137.1:5000/send-text',
data={'text': text}
)
print(f'Text Status: {response_text.status_code}, Response: {response_text.text}')
i = 0
while True:
i += 1
text_message = f'Hello {i} from Server!'
capture_frame_and_send(text_message)
time.sleep(1) # 根据需要调整延时
2.Flask端
flask段接收路由:
@app.route('/upload-image', methods=['POST'])
def upload_image():
image_file = request.files['image'] # 获取文件对象
image_data = image_file.read() # 读取文件内容
# 解码 Base64 编码的图像数据
image_data = base64.b64decode(image_data)
# 使用 PIL 将图像数据转换为图像对象并保存
image = Image.open(BytesIO(image_data))
image.save("static/received_image.jpg", "JPEG")
# 将图像数据转换为可在网页上显示的格式
image_string = base64.b64encode(image_data).decode('utf-8')
received_images[0] = f'data:image/jpeg;base64,{image_string}'
return jsonify({'status': 'success'})