Je travaille avec PyOpenCV. Comment convertir l'image cv2 (numpy) en chaîne binaire pour l'écriture dans la base de données MySQL sans fichier temporaire et imwrite
?
Je l'ai googlé mais je n'ai rien trouvé ...
J'essaie imencode
, mais cela ne fonctionne pas.
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()))
Erreur:
File "server.py", line 16, in do_GET
self.wfile.write(cv2.imencode('png', capture.read()))
TypeError: img is not a numerical Tuple
Aidez quelqu'un!
Si vous avez une image img
(qui est un tableau numpy) vous pouvez la convertir en chaîne en utilisant:
>>> img_str = cv2.imencode('.jpg', img)[1].tostring()
>>> type(img_str)
'str'
Maintenant, vous pouvez facilement stocker l'image dans votre base de données, puis la récupérer en utilisant:
>>> nparr = np.fromstring(STRING_FROM_DATABASE, np.uint8)
>>> img = cv2.imdecode(nparr, cv2.CV_LOAD_IMAGE_COLOR)
où vous devez remplacer STRING_FROM_DATABASE
avec la variable qui contient le résultat de votre requête dans la base de données contenant l'image.
capture.read () renvoie un Tuple, (err, img).
essayez de le diviser:
_,img = capture.read()
self.wfile.write(cv2.imencode('png', img))
Mon code pour utiliser opencv avec python cgi:
im_data = form['image'].file.read()
im = cv2.imdecode( np.asarray(bytearray(im_data), dtype=np.uint8), 1 )
ret, im_thresh = cv2.threshold( im, 128, 255, cv2.THRESH_BINARY )
self.send_response(200)
self.send_header("Content-type", "image/jpg")
self.end_headers()
ret, buf = cv2.imencode( '.jpg', im_thresh )
self.wfile.write( np.array(buf).tostring() )
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())