I need to write an OpenCV image that sits in memory to a BytesIO or Tempfile object for use elsewhere.
I am concerned this is a dead end question, because cv2.imwrite()
takes a filename as an argument, and then uses the file extension to infer the image type to write (.jpg
, .png
, .tiff
, etc.). cv2.imwrite()
does this at the C++ level, so I am concerned that there is no way to successfully pass a non-filename object to it.
The other possible solution is converting to PIL
through numpy
, which has the capacity to write to BytesIO
and Tempfile
objects, but I want to avoid needless copies.
cv2.imencode may help you:
import numpy as np
import cv2
import io
img = np.ones((100, 100), np.uint8)
# encode
is_success, buffer = cv2.imencode(".jpg", img)
io_buf = io.BytesIO(buffer)
# decode
decode_img = cv2.imdecode(np.frombuffer(io_buf.getbuffer(), np.uint8), -1)
print(np.allclose(img, decode_img)) # True
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With