2012-06-28 48 views
5

Tôi có một chương trình lưu hình ảnh trong thư mục cục bộ và sau đó đọc hình ảnh từ thư mục đó.Python: Urllib2 và OpenCV

Nhưng tôi không muốn lưu hình ảnh. Tôi muốn đọc trực tiếp từ url.

Dưới đây là mã của tôi:

import cv2.cv as cv 
import urllib2 

url = "http://cache2.allpostersimages.com/p/LRG/18/1847/M5G8D00Z/posters/curious-cat.jpg" 
filename = "my_test_image" + url[-4:] 
print filename 
opener = urllib2.build_opener() 

page = opener.open(url) 
img= page.read() 

abc = open(filename, "wb") 
abc.write(img) 
abc.close() 

img = cv.LoadImage(filename) 

cv.ShowImage("Optical Flow", img) 
cv.WaitKey(30) 

Nếu tôi thay đổi nó để:

img = cv.LoadImage(img) 

này sẽ cho tôi lỗi này:

argument 1 must be string without null bytes, not str

tôi có thể làm gì?

Trả lời

4

Nếu bạn muốn, bạn có thể sử dụng PIL.

import cv2.cv as cv 
import urllib2 
from cStringIO import StringIO 
import PIL.Image as pil 
url="some_url" 

img_file = urllib2.urlopen(url) 
im = StringIO(img_file.read()) 
source = pil.open(im).convert("RGB") 
bitmap = cv.CreateImageHeader(source.size, cv.IPL_DEPTH_8U, 3) 
cv.SetData(bitmap, source.tostring()) 
cv.CvtColor(bitmap, bitmap, cv.CV_RGB2BGR) 

Tôi đoán bằng phương pháp này bạn không cần phải lưu tệp hình ảnh.

+0

Cảm ơn điều này, rất hữu ích! Một điểm: Tôi gặp lỗi với "từ CStringIO ...". Nó phải là "từ cStringIO ..." (chữ thường 'c'). –

+0

xấu của tôi. Cảm ơn bạn đã chỉ ra điều đó. Tôi đã thay đổi nó. – Froyo

-1

Như đã đề cập here LoadImage mong filename như là đối số đầu tiên, không phải dữ liệu