Python OpenCV конвертирует изображение в байтовую строку?

Я работаю с PyOpenCV. Как преобразовать изображение cv2 (numpy) в двоичную строку для записи в базу данных MySQL без временного файла и imwrite?

Я погуглил, но ничего не нашел...

Я пытаюсь imencode, но это не работает.

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()))

Ошибка:

  File "server.py", line 16, in do_GET
  self.wfile.write(cv2.imencode('png', capture.read()))
  TypeError: img is not a numerical tuple

Помогите кому-нибудь!

Ответ 1

Если у вас есть образ img (который является массивом numpy), вы можете преобразовать его в строку, используя:

>>> img_str = cv2.imencode('.jpg', img)[1].tostring()
>>> type(img_str)
 'str'

Теперь вы можете легко сохранить изображение внутри своей базы данных, а затем восстановить его, используя:

>>> nparr = np.fromstring(STRING_FROM_DATABASE, np.uint8)
>>> img = cv2.imdecode(nparr, cv2.CV_LOAD_IMAGE_COLOR)

где вам нужно заменить STRING_FROM_DATABASE на переменную, содержащую результат вашего запроса, в базу данных, содержащую изображение.

Ответ 2

capture.read() возвращает кортеж, (err, img).

попробуйте разделить его:

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

Ответ 3

Мой код для использования opencv с 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() )

Ответ 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())