web-dev-qa-db-ja.com

Pythonバイト文字列からOpenCVロード画像

PHP function imagecreatefromstringのような文字列から画像をロードしようとしています

どうやってやるの?

MySQL blobフィールドイメージがあります。 MySQLdbを使用していますが、PyOpenCVで画像を操作するための一時ファイルを作成したくありません。

注:cv(cv2ではない)ラッパー関数が必要

30
featureoffuture

これは、通常、データベースに保存されている画像をPythonのOpenCV画像に変換するために使用します。

import numpy as np
import cv2
from cv2 import cv

# Load image as string from file/database
fd = open('foo.jpg')
img_str = fd.read()
fd.close()

# CV2
nparr = np.fromstring(img_str, np.uint8)
img_np = cv2.imdecode(nparr, cv2.CV_LOAD_IMAGE_COLOR) # cv2.IMREAD_COLOR in OpenCV 3.1

# CV
img_ipl = cv.CreateImageHeader((img_np.shape[1], img_np.shape[0]), cv.IPL_DEPTH_8U, 3)
cv.SetData(img_ipl, img_np.tostring(), img_np.dtype.itemsize * 3 * img_np.shape[1])

# check types
print type(img_str)
print type(img_np)
print type(img_ipl)

numpy.ndarrayからcv2.cv.iplimageへの変換を追加したため、上記のスクリプトは次のように出力されます。

<type 'str'>
<type 'numpy.ndarray'>
<type 'cv2.cv.iplimage'>
82
jabaldonedo

このコードを使用して、未処理のバッファー(プレーンピクセルデータ)を含む文字列からopencvを作成しようとしましたが、その特殊なケースでは機能しません。

そのため、この種のデータに対してこれを行う方法は次のとおりです。

image = np.fromstring(im_str, np.uint8).reshape( h, w, nb_planes )

(ただし、はい、画像のプロパティを知る必要があります)

bチャネルとGチャネルが並べ替えられている場合、修正方法は次のとおりです。

image = cv2.cvtColor(image, cv2.cv.CV_BGR2RGB)
6
Alexandre Mazel