Python OpenCV load image from byte string
This is what I normally use to convert images stored in database to OpenCV images in Python.
import numpy as npimport cv2from cv2 import cv# Load image as string from file/databasefd = open('foo.jpg')img_str = fd.read()fd.close()# CV2nparr = np.fromstring(img_str, np.uint8)img_np = cv2.imdecode(nparr, cv2.CV_LOAD_IMAGE_COLOR) # cv2.IMREAD_COLOR in OpenCV 3.1# CVimg_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 typesprint 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.
I think this answer provided on this stackoverflow question is a better answer for this question.
Quoting details (borrowed from @lamhoangtung from above linked answer)
import base64import jsonimport cv2import numpy as npresponse = json.loads(open('./0.json', 'r').read())string = response['img']jpg_original = base64.b64decode(string)jpg_as_np = np.frombuffer(jpg_original, dtype=np.uint8)img = cv2.imdecode(jpg_as_np, flags=1)cv2.imwrite('./0.jpg', img)
I've try to use this code to create an opencv from a string containing a raw buffer (plain pixel data) and it doesn't work in that peculiar case.
So here's how to do that for this kind of data:
image = np.fromstring(im_str, np.uint8).reshape( h, w, nb_planes )
(but yes you need to know your image properties)
if your B and G channel is permuted, here's how to fix it:
image = cv2.cvtColor(image, cv2.cv.CV_BGR2RGB)