Python OpenCV convertit l'image en byte string?

je travaille avec PyOpenCV. Comment convertir cv2 image (numpy) en chaîne binaire pour écrire à MySQL db sans fichier temporaire et imwrite?

je suis google mais rien trouvé...

je vais essayer imencode, mais ça 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!

20
demandé sur jabaldonedo 2013-07-31 13:59:36

3 réponses

Si vous avez une image img (qui est un numpy array) vous pouvez le 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 à la base de données contenant l'image.

40
répondu jabaldonedo 2017-09-20 13:14:33

capture.read () retourne un tuple, (err,img).

essayez de diviser:

_,img = capture.read()
self.wfile.write(cv2.imencode('png', img))
3
répondu berak 2013-07-31 12:46:14

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() )
1
répondu themadmax 2014-05-13 15:09:01