使用CV2读取图像文件(文件存储对象)

AKS*_*HAN 6 curl image flask cv2

我正在通过curl将图像发送到烧瓶服务器,我正在使用此curl命令

curl -F "file=@image.jpg" http://localhost:8000/home
Run Code Online (Sandbox Code Playgroud)

我试图在服务器端使用CV2读取文件.

在服务器端,我通过此代码处理图像

@app.route('/home', methods=['POST'])
def home():
    data =request.files['file']
    img = cv2.imread(data)
    fact_resp= model.predict(img)
    return jsonify(fact_resp)
Run Code Online (Sandbox Code Playgroud)

我收到这个错误 -

img = cv2.imread(data)
TypeError: expected string or Unicode object, FileStorage found
Run Code Online (Sandbox Code Playgroud)

如何在服务器端使用CV2读取文件?

谢谢!

fla*_*ite 17

我在使用带烧瓶服务器的opencv时遇到了类似的问题,首先我将图像保存到磁盘并使用cv2.imread()再次使用保存的文件路径读取该图像

这是一个示例代码:

data =request.files['file']
filename = secure_filename(file.filename) # save file 
filepath = os.path.join(app.config['imgdir'], filename);
file.save(filepath)
cv2.imread(filepath)
Run Code Online (Sandbox Code Playgroud)

但是现在通过使用cv2.imdecode()从numpy数组中读取图像,我从这里获得了更有效的方法,如下所示:

#read image file string data
filestr = request.files['file'].read()
#convert string data to numpy array
npimg = numpy.fromstring(filestr, numpy.uint8)
# convert numpy array to image
img = cv2.imdecode(npimg, cv2.CV_LOAD_IMAGE_UNCHANGED)
Run Code Online (Sandbox Code Playgroud)

  • 对于第二个技巧,对opencv 3.1使用img = cv2.imdecode(npimg,cv2.IMREAD_COLOR) (5认同)

AKS*_*HAN 7

经过一番实验,我自己找到了一种使用 CV2 读取文件的方法。为此,我首先使用 PIL.image 方法读取图像

这是我的代码,

@app.route('/home', methods=['POST'])
def home():
    data =request.files['file']
    img = Image.open(request.files['file'])
    img = np.array(img)
    img = cv2.resize(img,(224,224))
    img = cv2.cvtColor(np.array(img), cv2.COLOR_BGR2RGB)
    fact_resp= model.predict(img)
    return jsonify(fact_resp)
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何直接的方法可以在不使用 PIL 的情况下做到这一点。


小智 5

所以如果你想做类似的事情,

file = request.files['file']
img = cv.imread(file) 
Run Code Online (Sandbox Code Playgroud)

然后这样做

import numpy as np
file = request.files['file']
file_bytes = np.fromfile(file, np.uint8)
file = cv.imdecode(file_bytes, cv.IMREAD_COLOR)
Run Code Online (Sandbox Code Playgroud)

现在您不需要cv.imread()再次执行此操作,但可以在下一行代码中使用它。

这适用于 OpenCV v3.x 及更高版本