17

I have an uploaded file in memory. I want to manipulate the file with cv2. Currently, I write the file to disk then read it with cv2. How can I skip writing the file and load it directly with cv2?

file = request.files['file']
# if file and allowed_file(file.filename):

# save file            
filename = secure_filename(file.filename)
file_path = os.path.join(dressrank.config['SHOW_IMG_FOLDER'], filename);
file.save(file_path)
img_path = file_path

# COLOR FATURE EXTRACTION
img = read_img(img_path)
img =img_resize(img, 500)
davidism
  • 121,510
  • 29
  • 395
  • 339
erogol
  • 13,156
  • 33
  • 101
  • 155

2 Answers2

37

Build a numpy array using the uploaded data. Decode this array using cv2.

img = cv2.imdecode(numpy.fromstring(request.files['file'].read(), numpy.uint8), cv2.IMREAD_UNCHANGED)

Prior to OpenCV 3.0, use cv2.CV_LOAD_IMAGE_UNCHANGED instead.


See also: Python OpenCV load image from byte string

davidism
  • 121,510
  • 29
  • 395
  • 339
3

If working with BaseHTTPRequestHandler, one should first create a FieldStorage form:

fm = cgi.FieldStorage(fp=self.rfile, headers=self.headers, environ={'REQUEST_METHOD':'POST'})

then:

if "file" in fm:            
    image = cv2.imdecode(np.frombuffer(fm['file'].file.read(), np.uint8), cv2.IMREAD_UNCHANGED)

Also, note that fromstring is deprecated, and that's why I'm updating davidism's answer with frombuffer.

Catalin Pirvu
  • 175
  • 2
  • 8