私はPyOpenCVで作業しています。一時ファイルとimwrite
なしでMySQL dbに書き込むためにcv2イメージ(numpy)をバイナリ文字列に変換する方法は?
グーグルで検索したが何も見つからなかった...
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
誰か助けて!
イメージ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
を、画像を含むデータベースへのクエリの結果を含む変数で置き換える必要がある場合。
capture.read()は、タプル(err、img)を返します。
分割してみてください:
_,img = capture.read()
self.wfile.write(cv2.imencode('png', img))
python cgiでopencvを使用する私のコード:
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())