Das Beispiel, das Sie anpassen wollten, ist für die neue Python-Schnittstelle für OpenCV 2.0. Dies ist wahrscheinlich die Quelle der Verwechslung zwischen den vorangestellten und nicht vorangestellten Funktionsnamen (cv.cvSetData()
gegenüber cv.SetData()
).
OpenCV 2.0 jetzt Schiffe mit zwei Sätzen von Python-Bindungen:
- Die "old-style" python wrapper, ein Python-Paket mit dem
opencv.{cv,highgui,ml}
Module
- Die new interface, ein Python C Verlängerung (
cv.pyd
), die wickelt alle OpenCV Funktionen (einschließlich der highgui
und ml
Modulen.)
der Grund für die Fehlermeldung ist, dass der Wickel SWIG per behandelt keine Konvertierung von einer Python-Zeichenfolge in einen einfachen alten C-Puffer. Der SWIG-Wrapper wird jedoch mit dem Modul opencv.adaptors
geliefert, das Konvertierungen von numpy
und PIL
Images zu OpenCV unterstützt.
Der folgende (getestet) Code sollte Ihr ursprüngliches Problem (Umwandlung von PIL zu OpenCV) unter Verwendung der SWIG Schnittstelle lösen:
# PIL to OpenCV using the SWIG wrapper
from opencv import cv, adaptors, highgui
import PIL
pil_img = PIL.Image.open(filename)
cv_img = adaptors.PIL2Ipl(pil_img)
highgui.cvNamedWindow("pil2ipl")
highgui.cvShowImage("pil2ipl", cv_img)
Dies ist jedoch nicht die Tatsache löst, dass die cv.cvSetData()
Funktion wird immer scheitern (mit der aktuellen SWIG-Wrapper-Implementierung). Sie könnten dann den neuen Stil-Wrapper verwenden, mit dem Sie die cv.SetData()
Funktion verwenden können, wie man erwarten würde:
# PIL to OpenCV using the new wrapper
import cv
import PIL
pil_img = PIL.Image.open(filename)
cv_img = cv.CreateImageHeader(pil_img.size, cv.IPL_DEPTH_8U, 3) # RGB image
cv.SetData(cv_img, pil_img.tostring(), pil_img.size[0]*3)
cv.NamedWindow("pil2ipl")
cv.ShowImage("pil2ipl", cv_img)
Ein dritter Ansatz wäre Ihre OpenCV Python-Schnittstelle zum ctypes-based wrapper zu wechseln. Es kommt mit Hilfsfunktionen zur expliziten Datenkonvertierung zwischen z.B. Python-Strings und C-Puffer. Ein kurzer Blick auf google code search scheint darauf hinzuweisen, dass dies eine Arbeitsmethode ist.
Bezüglich des dritten Parameters der cvSetData()
Funktion, Größe des Bildpuffers, aber der Bildschritt. Der Schritt ist die Anzahl der Bytes in einer Zeile Ihres Bildes, also pixel_depth * number_of_channels * image_width
. Der Parameter pixel_depth
ist die Größe der Daten in Byte, die einem Kanal zugeordnet sind. In Ihrem Beispiel wäre es einfach die Bildbreite (nur ein Kanal, ein Byte pro Pixel).
Der Code, den Sie in oben getippt einen nicht definierten Namen hat in ihm (cvSetData), so ist es schwer zu wissen, ob du es tatsächlich versucht hast. –
@ Jonathan: Ich bekomme nicht den Fehler, den Sie erwähnten. cvSetData ist in der Tat eine gültige Funktion definiert in opencv.cv – Arkady
Was ist der Status der Antwort, derzeit? –