2013-06-18 40 views
17

Tôi đang cố gắng tải hình ảnh từ chuỗi giống như hàm PHP imagecreatefromstringHình ảnh tải OpenCV của Python từ chuỗi byte

Làm cách nào để làm điều đó?

Tôi có hình ảnh trường blob MySQL. Tôi đang sử dụng MySQLdb và không muốn tạo tệp tạm thời để làm việc với hình ảnh trong PyOpenCV.

Chú ý: cần cv (không CV2) wrapper chức năng

Trả lời

45

Đây là những gì tôi thường sử dụng để chuyển đổi hình ảnh được lưu trữ trong cơ sở dữ liệu hình ảnh OpenCV bằng Python.

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) 

Tôi đã thêm chuyển đổi numpy.ndarray-cv2.cv.iplimage, vì vậy kịch bản trên sẽ in:

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

wow! cảm ơn bạn! tôi tìm kiếm trong Google, nhưng không thấy rằng :) – featureoffuture

+0

Bạn được chào đón! nhớ upvote/chấp nhận câu trả lời nếu bạn thấy nó hữu ích :) – jabaldonedo

+0

bây giờ tôi không thể, nhưng khi tôi có thể upvote rằng – featureoffuture

2

Tôi đã cố gắng sử dụng mã này để tạo ra một opencv từ một chuỗi chứa một bộ đệm thô (dữ liệu pixel đơn giản) và nó không hoạt động trong trường hợp đặc biệt đó.

Vì vậy, dưới đây là cách để làm điều đó cho các loại hình dữ liệu:

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

(nhưng có bạn cần phải biết các thuộc tính hình ảnh của bạn)

nếu B và kênh G được hoán vị, đây là cách để sửa lỗi:

image = cv2.cvtColor(image, cv2.cv.CV_BGR2RGB) 
Các vấn đề liên quan