从HTML表单获取图片后用OpenCV裁剪时读取报错求助
问题原因
cv2.imread() 仅接受本地文件路径字符串作为参数,但你传入的是Flask的FileStorage对象(即request.files['pic']返回的内容),类型不匹配导致报错。
解决方法
以下是两种可行的处理方案:
方法1:先保存文件到本地再读取
先将上传的图片保存到服务器本地目录,再通过文件路径传给cv2.imread():
from flask import Flask, request, render_template import cv2 import os @app.route('/update-doc', methods=['GET', 'POST']) def updateDoc(): if request.method == 'POST': profileimg = request.files['pic'] # 确保uploads文件夹存在,不存在则创建 os.makedirs('uploads', exist_ok=True) # 定义文件保存路径 save_path = os.path.join('uploads', profileimg.filename) profileimg.save(save_path) # 通过路径读取图片 img = cv2.imread(save_path) # 此处添加图片裁剪等后续操作 # ... return render_template('你的模板文件名.html')
方法2:直接读取字节流(无需本地保存)
读取文件字节数据并转换为OpenCV可处理的格式,避免写入磁盘:
from flask import Flask, request, render_template import cv2 import numpy as np @app.route('/update-doc', methods=['GET', 'POST']) def updateDoc(): if request.method == 'POST': profileimg = request.files['pic'] # 读取文件字节数据 img_bytes = profileimg.read() # 转换为numpy数组 img_array = np.frombuffer(img_bytes, np.uint8) # 解码为OpenCV格式图片 img = cv2.imdecode(img_array, cv2.IMREAD_COLOR) # 此处添加图片裁剪等后续操作 # 示例:img_cropped = img[100:300, 200:400] # ... return render_template('你的模板文件名.html')
额外注意事项
- 方法1中需确保
uploads文件夹存在,可通过os.makedirs('uploads', exist_ok=True)自动创建。 - 若使用方法1,建议在处理完成后清理临时文件,避免占用磁盘空间。
- 需添加文件合法性校验(如检查文件类型、大小),防止恶意文件上传。
内容的提问来源于stack exchange,提问作者Adrian Miguel
相关产品推荐
相关产品推荐

