2013-07-31 4 views
14

Pracuję z PyOpenCV. Jak przekonwertować obraz cv2 (numpy) na ciąg binarny do zapisu do MySQL db bez pliku tymczasowego i imwrite?Python OpenCV przekonwertować obraz na ciąg bajtów?

jestem google ale nic nie znaleziono ...

Próbuję imencode, ale to nie działa

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())) 

Error:

File "server.py", line 16, in do_GET 
    self.wfile.write(cv2.imencode('png', capture.read())) 
    TypeError: img is not a numerical tuple 

komuś pomóc!

Odpowiedz

3

capture.read() zwraca krotkę (err, img).

spróbuj podzielić go:

_,img = capture.read() 
self.wfile.write(cv2.imencode('png', img)) 
+0

zwraca (prawda, tablica ([[137], [80], [78], ..., [66], [96], [130]], dtype = uint8)), ale nie bajt string – xercool

+0

Jak przekonwertować to na ciąg bajtów? – xercool

+1

moim rozwiązaniem jest 'self.wfile.write (numpy.array (cv2.imencode ('. Png', img) [1]). Tostring())' – xercool

1

Mój kod używać OpenCV z Pythona CGI:

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()) 
25

Jeśli masz obrazek img (co jest numpy tablicy) można przekształcić go w ciąg znaków za pomocą:

>>> img_str = cv2.imencode('.jpg', img)[1].tostring() 
>>> type(img_str) 
'str' 

Teraz możesz łatwo przechowywać obraz wewnątrz swojej bazy danych, a następnie pl odzyskać go za pomocą:

>>> nparr = np.fromstring(STRING_FROM_DATABASE, np.uint8) 
>>> img = cv2.imdecode(nparr, cv2.CV_LOAD_IMAGE_COLOR) 

gdzie trzeba wymienić STRING_FROM_DATABASE ze zmienną, która zawiera wynik zapytania do bazy danych zawierającej obraz.