2013-06-18 12 views

Odpowiedz

45

To, co normalnie używać do konwersji obrazów zapisanych w bazie danych do obrazów OpenCV w Pythonie.

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) 

Dodałem konwersję z numpy.ndarray do cv2.cv.iplimage, więc skrypt powyżej wypisze:

<type 'str'> 
<type 'numpy.ndarray'> 
<type 'cv2.cv.iplimage'> 
+0

wow! Dziękuję Ci! szukam tego w Google, ale nie znalazłem tego :) – featureoffuture

+0

Nie ma za co! Pamiętam upvote/zaakceptować odpowiedź, jeśli okaże się ona przydatna :) – jabaldonedo

+0

teraz nie mogę, ale kiedy mogę i upvote że – featureoffuture

2

ja spróbuje użyć tego kodu, aby utworzyć OpenCV z ciągiem zawierającym buforze RAW (zwykłe dane pikseli) i nie działa w tym osobliwym przypadku.

Więc oto jak to zrobić dla tego rodzaju danych:

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

(ale tak trzeba znać swoje właściwości obrazu)

jeśli permutytu Twój B i G kanał, oto jak napraw to:

image = cv2.cvtColor(image, cv2.cv.CV_BGR2RGB)