2012-11-14 24 views
13

Vor ein paar Tagen ging ich in die Suche nach einem guten Weg, um ein einfaches Computer Vision System zu machen. OpenCV-Bibliothek ist etwas, was ich brauche, aber es erwies sich als schwierig, mit Python zu lernen, besonders nach OpenCV 2.4.3 update, die sehr schlanke Python-bezogene Dokumentation haben. So verstehe ich jetzt, dass es eine Reihe von Änderungen in OpenCV war, für exaxmpleOpenCV 2.4.3 und Python

import cv 

ist jetzt

import cv2 

Und es gibt Bündel von Modulen, die fehlt. Ich meine, ja, es gibt Beispiele für die neue Python-Opencv-Syntax, aber es ist sehr eng und schwer zu verstehen. Zum Beispiel: Beispiel in der offiziellen Dokumentation für Python-Code

cv2.cvtColor(src, code[, dst[, dstCn]]) 

Ich weiß, was dieser Code bedeutet und wie es zu benutzen, zumindest glaube ich, ich weiß. Aber das Schreiben Quelle und Farbcode nicht gibt nichts nur mir:

Traceback (most recent call last): 
    File "C:\FILEFOLDER\tut.py", line 11, in <module> 
    cv.cvtColor('proba.jpg', 'CV_RGB2GRAY') 
TypeError: an integer is required 

Oder wenn ich versuche, Code wie Variable zu schreiben:

Traceback (most recent call last): 
    File "C:\FILEFOLDER\tut.py", line 11, in <module> 
    cv.cvtColor('proba.jpg', CV_RGB2GRAY) 
NameError: name 'CV_RGB2GRAY' is not defined 

So gibt es eine Python Referenzdokument/tutorial/Buch/guide für den neuesten OpenCV mit den grundlegenden Erklärungen, die Newbie wie mich nicht mit unerwünschten Codebeispielen für C++ oder Java verwirren?

+0

hi, python-opencv doc ist sehr alt. Als ich es vor 2 Jahren benutzt habe, hatte ich das gleiche Problem. Wie ich mich erinnern kann, war 1 Parameter in Python implizit und in C Doc, war es explizit. Es fiel mir schwer, es herauszufinden. Ich glaube, mit opencv in C zu arbeiten ist einfacher zu python opencv auch, es ist schneller in C. – Netro

+0

Also wenn ich Computer Vision entwickeln möchte ich lernen C :) – Domagoj

+1

Ich würde Ihnen empfehlen, OpenCV in C++ zu versuchen, es ist gut dokumentiert und hat eine große Community, trotzdem sollte Python eine ordentliche OpenCV-Dokumentation bekommen, die ich dir gebe. Vielleicht könntest du PIL ausprobieren, wenn du etwas Einfaches tust. – PepperoniPizza

Antwort

9

Ich denke, Sie nehmen es auf dem umgekehrten Weg.

Tatsächlich ist OpenCV mit dem neuen Modul cv2 viel einfacher geworden, verglichen mit der alten cv Schnittstelle. Nicht einfach, aber sehr schnell und sehr produktiv, dank der Unterstützung von Numpy. Das einzige ist, dass wir wissen sollten, wie man es richtig benutzt.

Hier sollten Sie die Funktion wie folgt verwenden:

img = cv2.imread('pic.jpg') 
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 

Ich möchte Ihnen ein SOF besuchen, die einen Vergleich zeigt zwischen den beiden Modulen: What is different between all these OpenCV Python interfaces?

Ein weiterer SOF ist hier, die ist eine einfache Demonstration, wie Sie den Code mit Numpy-Unterstützung beschleunigen können: Performance comparison of OpenCV-Python interfaces, cv and cv2

Sie müssen nicht C++ oder C lernen, um OpenCV zu verwenden, obwohl C++ die offizielle Sprache ist. Trotzdem hat Python-OpenCV gute Unterstützung. Sobald Sie OpenCV verwenden, können Sie C++ - Codes selbst in Python konvertieren. Dann können Sie OpenCV auch aus C++ Tutorials lernen. Zum Beispiel begann ich OpenCV von "Learning OpenCV" von Gary Bradsky zu lernen, das komplett in C++ ist. Zu dieser Zeit gab es nur cv Schnittstelle.

Wie Sie in Ihren Kommentaren erwähnt haben, hat opencvpython.blogspot.com einführende Tutorials. Ich begann damit, Neulinge in OpenCV zu fokussieren.

überprüfen Sie auch diese SOF für weitere Tutorials: Books for OpenCV and Python?

4

es aus einem anderen Blickwinkel zu nehmen und lassen Sie älteren Code mit neuen OpenCV Installation Versionen laufen ...

Der erste Schritt von CV zu CV2 hat mit der Bibliothek zu tun, die verschiedene Datenstrukturen für viele Funktionen verwendet. Der einfachste Weg zu erkennen, ob sich eine Funktion zwischen cv2 und cv geändert hat, ist, dass cv-Funktionen mit einem Großbuchstaben beginnen. Überarbeitete cv2-Funktionen scheinen immer den ersten Buchstaben in Kleinbuchstaben zu haben. Wenn Sie also ein altes Buch oder alte Beispiele verwenden, können Sie immer noch den Legacy-Lebenslauf verwenden. cv ist jetzt einfach in cv2 eingebettet. Verwenden Sie einfach den folgenden Punkt oben in Ihren Skripten:

import cv2 
    import cv2.cv as cv #required for old code not to be changed 

Damit können Sie einfach älteren Code ausführen, ohne ihn zu ändern. Ich werde hier mit Ihrem Funktionsaufruf demonstrieren. Sie hatten ...

cv.cvtColor('proba.jpg', 'CV_RGB2GRAY') 

Das erste, was ich bemerke, ist, dass Ihre Funktion falsch genannt werden kann. (Wenn der erste Buchstabe der Funktion klein geschrieben ist, sollte er mit cv2 nicht cv beginnen). Zweitens ist der "Code", den Sie die Funktion übergeben. "Codes" sind Mitglieder (coding noob hier, verzeih mir, wenn einige meiner Vokabeln ungenau sind) von cv2 und cv, aber nicht immer gleich. Sie haben 'CV_RGB2GRAY'. Erstens, keine Zitate. Dies ist ein cv 'code' nicht cv2. Auch Sie vermissen den 'Lebenslauf'. vor. Um zu zeigen, hier ist, wie ich glaube, Ihre Funktion sollte für alte cv Version aufgerufen werden:

cv.CvtColor('proba.jpg', cv.CV_RGB2GRAY) #Assuming you used listed imports 
    cv2.cv.CvtColor('proba.jpg', cv2.cv.CV_RGB2GRAY) #Assuming you skipped second import 

Und jetzt cv2 ...

cv2.cvtColor('proba.jpg', cv2.COLOR_RGB2GRAY) 

Dort gehen Sie, ich hoffe, das hilft. Denken Sie daran, dass wenn Python von Skripten abläuft, Sie alles, was Sie nicht genau wissen, direkt in die Befehlszeile eingeben können. Das macht Wunder für mein Verständnis (ich habe Python vor 5 Tagen benutzt). Wenn Sie zum Beispiel fragen sich, warum es eine ganze Zahl in Ihrer Funktion wollte, wenn Sie

cv.CV_RGB2GRAY 

direkt in die Python-Befehlszeile eingeben, spuckt es ‚7‘ (praktisch, dass es ein int) an Dich zurück. Die cv2-Version spuckt '7L' aus. Denken Sie daran, die Funktion WaitKey() immer wieder in irgendeiner Form zu verwenden, da highgui in einigen Situationen möglicherweise nicht die erforderliche Zeit hat, um einige Befehle zu verarbeiten. Nun, das schließt es auf. Tut mir leid, wenn ich einige Dinge behandelt habe, die bereits abgedeckt oder referenziert wurden. Wenn ich mich frei fühlen würde, es zu löschen, Admins.