2016-04-24 7 views
2

Ich habe ein Bild aus einem Fenster-Screenshot mit Win32gui erstellt. Das Objekt ist vom Typ:Ein PyCBitmap mit OpenCV lesen

object 'PyCBitmap' - assoc is 000002AF9A64DB50, vi=<None> 

Ich möchte dann dieses mit OpenCV zur Analyse übergeben. Ich habe Erfolg in einer gespeicherten .bmp Datei zu lesen gemacht mit:

cv2.imread(img_file, 0) 

Bei der Verwendung von cv2.imread für ein PyCBitmap Objekt versucht, ich die folgende Fehlermeldung erhalten:

TypeError: bad argument type for built-in operation 

Meine Frage ist:

Wie kann ich das PyCBitmap-Objekt in einen akzeptablen Typ für cv2.imread konvertieren, ohne das Objekt zuerst als BMP-Datei speichern zu müssen?

Vielen Dank im Voraus,

Behzad

ps ich opencv bin mit 3.1 mit Python-Bindings, ich bin gerne mit Rat in C geschrieben folgen ++ oder Python :)

Antwort

0

Ich war für die gleiche Sache suchen, und ich fand es schließlich durch mehrere andere SO Antworten kombiniert:

Grundsätzlich ist der Code, den ich herauskam, ist:

import PIL, numpy, cv2 
bmpinfo = dataBitMap.GetInfo() 
bmparray = numpy.asarray(dataBitMap.GetBitmapBits(), dtype=numpy.uint8) 
pil_im = Image.frombuffer('RGB', (bmpinfo['bmWidth'], bmpinfo['bmHeight']), bmparray, 'raw', 'BGRX', 0, 1) 
pil_array = numpy.array(pil_im) 
cv_im = cv2.cvtColor(pil_array, cv2.COLOR_RGB2BGR) 

Kurze Erklärung: Python OpenCV verwendet nur numpy Arrays, so dass der Trick ist wirklich immer die Bytes in den rechten numpy Array-Format. Wie es sich herausstellt, benötigen Sie dafür eine Bildverarbeitungsbibliothek wie PIL, die mit der bildspezifischen Logik wie dem Ausschneiden des Alphakanals umgehen kann. Die Eingabedaten sind im Allgemeinen RGBX-Format, PIL konvertiert in RGB und OpenCV konvertiert das in BGR, das es mag.

Ich profilierte dies und leider ist es dramatisch langsamer als GetBitmapBits() und bei der Umwandlung seiner Tupel Ergebnis in ein Array.