Can an uploaded image be loaded directly by cv2?

11,118

Solution 1

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

Solution 2

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.

Share:
11,118
erogol
Author by

erogol

Mozilla TTS - https://github.com/mozilla/TTS

Updated on June 15, 2022

Comments

  • erogol
    erogol almost 2 years

    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)