web-dev-qa-db-fra.com

Python OpenCV convertir l'image en chaîne d'octets?

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!

27
xercool

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.

59
jabaldonedo

capture.read () renvoie un Tuple, (err, img).

essayez de le diviser:

_,img = capture.read()
self.wfile.write(cv2.imencode('png', img))
4
berak

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() )
2
themadmax
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())
2
remort