Search code examples
pythonimageopencvbyte

Python OpenCV load image from byte string


I'm trying to load image from string like as PHP function imagecreatefromstring

How can I do that?

I have MySQL blob field image. I'm using MySQLdb and don't want create temporary file for working with images in PyOpenCV.

NOTE: need cv (not cv2) wrapper function


Solution

  • This is what I normally use to convert images stored in database to OpenCV images in Python.

    import numpy as np
    import cv2
    from cv2 import cv
    
    # Load image as string from file/database
    fd = open('foo.jpg','rb')
    img_str = fd.read()
    fd.close()
    
    # CV2
    nparr = np.fromstring(img_str, np.uint8)
    img_np = cv2.imdecode(nparr, cv2.CV_LOAD_IMAGE_COLOR) # cv2.IMREAD_COLOR in OpenCV 3.1
    
    # CV
    img_ipl = cv.CreateImageHeader((img_np.shape[1], img_np.shape[0]), cv.IPL_DEPTH_8U, 3)
    cv.SetData(img_ipl, img_np.tostring(), img_np.dtype.itemsize * 3 * img_np.shape[1])
    
    # check types
    print type(img_str)
    print type(img_np)
    print type(img_ipl)
    

    I have added the conversion from numpy.ndarray to cv2.cv.iplimage, so the script above will print:

    <type 'str'>
    <type 'numpy.ndarray'>
    <type 'cv2.cv.iplimage'>
    

    EDIT: As of latest numpy 1.18.5 +, the np.fromstring raise a warning, hence np.frombuffer shall be used in that place.