Python OpenCV convert image to byte string?
101,189
Solution 1
If you have an image img
(which is a numpy array) you can convert it into string using:
>>> img_str = cv2.imencode('.jpg', img)[1].tostring()
>>> type(img_str)
'str'
Now you can easily store the image inside your database, and then recover it by using:
>>> nparr = np.fromstring(STRING_FROM_DATABASE, np.uint8)
>>> img = cv2.imdecode(nparr, cv2.CV_LOAD_IMAGE_COLOR)
where you need to replace STRING_FROM_DATABASE
with the variable that contains the result of your query to the database containing the image.
Solution 2
It works in 2020 with numpy==1.19.4 and opencv==4.4.0:
import cv2
cam = cv2.VideoCapture(0)
# get image from web camera
ret, frame = cam.read()
# convert to jpeg and save in variable
image_bytes = cv2.imencode('.jpg', frame)[1].tobytes()
Solution 3
Here is an example:
def image_to_bts(frame):
'''
:param frame: WxHx3 ndarray
'''
_, bts = cv2.imencode('.webp', frame)
bts = bts.tostring()
return bts
def bts_to_img(bts):
'''
:param bts: results from image_to_bts
'''
buff = np.fromstring(bts, np.uint8)
buff = buff.reshape(1, -1)
img = cv2.imdecode(buff, cv2.IMREAD_COLOR)
return img
Solution 4
im = cv2.imread('/tmp/sourcepic.jpeg')
res, im_png = cv2.imencode('.png', im)
with open('/tmp/pic.png', 'wb') as f:
f.write(im_png.tobytes())
Solution 5
capture.read() returns a tuple, (err,img).
try splitting it up:
_,img = capture.read()
self.wfile.write(cv2.imencode('png', img))
Author by
xercool
Updated on July 09, 2022Comments
-
xercool almost 2 years
I'm working with PyOpenCV. How to convert cv2 image (numpy) to binary string for writing to MySQL db without a temporary file and
imwrite
?I googled it but found nothing...
I'm trying
imencode
, but it doesn't work.capture = cv2.VideoCapture(url.path) capture.set(cv2.cv.CV_CAP_PROP_POS_MSEC, float(url.query)) self.wfile.write(cv2.imencode('png', capture.read()))
Error:
File "server.py", line 16, in do_GET self.wfile.write(cv2.imencode('png', capture.read())) TypeError: img is not a numerical tuple
Help somebody!
-
xercool almost 11 yearsit returns (True, array([[137], [ 80], [ 78], ..., [ 66], [ 96], [130]], dtype=uint8)), but not a byte string
-
xercool almost 11 yearsHow to convert that to byte string?
-
xercool almost 11 yearsmy solution is
self.wfile.write(numpy.array(cv2.imencode('.png', img)[1]).tostring())
-
ichbinblau over 5 yearshave to use
cv2.imdecode(nparr, cv2.IMREAD_COLOR)
for opencv3.0+ -
feature_engineer almost 4 yearsisn't tobytes() better than tostring(), just as numpy recommends using frombuffer() instead of fromstring()?