Чтение файла изображения (объекта хранения файлов) с использованием CV2

Я отправляю изображение с помощью curl на сервер фляги, я использую эту команду curl

curl -F "[email protected]" http://localhost:8000/home

и я пытаюсь прочитать файл, используя 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)

Я получаю эту ошибку-

img = cv2.imread(data)
TypeError: expected string or Unicode object, FileStorage found

Как мне прочитать файл с помощью CV2 на стороне сервера?

Спасибо!


person AKSHAYAA VAIDYANATHAN    schedule 27.11.2017    source источник
comment
См. stackoverflow.com/questions/ 17170752/ для (более простого) способа. Обратите внимание, что наличие cv2 означает, что доступно numpy (np).   -  person Dave W. Smith    schedule 01.12.2017


Ответы (4)


У меня были аналогичные проблемы при использовании opencv с сервером flask, для этого сначала я сохранил изображение на диск и снова прочитал это изображение, используя сохраненный путь к файлу, используя 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)

Но теперь у меня есть еще более эффективный подход здесь с помощью < strong>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)
person flamelite    schedule 28.12.2017
comment
Для второго трюка используйте img = cv2.imdecode(npimg,cv2.IMREAD_COLOR) для opencv 3.1 - person user1; 27.02.2018

После небольшого эксперимента я сам нашел способ прочитать файл с помощью 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)

Интересно, есть ли какой-нибудь прямой способ сделать это без использования PIL.

person AKSHAYAA VAIDYANATHAN    schedule 27.11.2017

Итак, если вы хотите сделать что-то вроде,

file = request.files['file']
img = cv2.imread(file) 

тогда сделай так

import numpy as np
file = request.files['file']
npimg = np.fromfile(file, np.uint8)
file = cv2.imdecode(npimg, cv2.IMREAD_COLOR)

Теперь вам не нужно снова выполнять cv2.imread(), но вы можете использовать это в следующей строке кода.

Это относится к opencv> 3

person Sahana M    schedule 20.03.2020

Двухстрочное решение, измените оттенки серого на то, что вам нужно

 npimg = numpy.fromfile(request.files['image'], numpy.uint8)
 # convert numpy array to image
 img = cv2.imdecode(npimg, cv2.IMREAD_GRAYSCALE)
person Artem Ibragimov    schedule 21.09.2018