Was ist der Unterschied zwischen all diesen OpenCV Python-Schnittstellen?

88

Es gibt

Was sind die Hauptunterschiede und welche sollte ich verwenden?

Framester
quelle

Antworten:

137

Offiziell veröffentlicht OpenCV zwei Arten von Python-Schnittstellen cvund cv2.

Lebenslauf:

Ich fing an zu arbeiten cv. Dabei bleiben alle OpenCV-Datentypen als solche erhalten. Wenn Bilder geladen werden cvMat, haben sie beispielsweise das gleiche Format wie in C ++.

Für Array - Operationen gibt es mehrere Funktionen wie cvSet2D, cvGet2Dusw. Und einige Diskussionen sagen, sie sind langsamer.

Für imageROI benötigen Sie spezielle Funktionen wie cvSetImageROI.

Wenn Sie Konturen finden, werden cvSeqStrukturen zurückgegeben, mit denen im Vergleich zu Python-Listen oder NumPy-Arrays nicht so gut gearbeitet werden kann.

(Und ich denke, bald wird seine Entwicklung gestoppt. Früher gab es nur cv. Später kam OpenCV mit beiden cvund cv2. Jetzt gibt es in den neuesten Versionen nur das cv2Modul und cveine Unterklasse im Inneren cv2. Sie müssen anrufen import cv2.cv as cvum darauf zuzugreifen.)

cv2:

Und das neueste ist cv2. Dabei zurückgegeben wird alles als NumPyObjekte wie ndarray und native PythonObjekte wie lists, tuples, dictionaryusw. So aufgrund dieser NumPy Unterstützung, können Sie hier jeden numpy Betrieb tun. NumPyist eine hochstabile und schnelle Array-Verarbeitungsbibliothek.

Wenn Sie beispielsweise ein Bild laden, wird ein ndarrayzurückgegeben.

array[i,j] gibt Ihnen den Pixelwert an der Position (i, j).

Auch für imageROI kann Array-Slicing wie verwendet werden ROI=array[c1:c2,r1:r2]. Keine separaten Funktionen erforderlich.

Um zwei Bilder hinzuzufügen, müssen Sie keine Funktion aufrufen res = img1+img2. (Die NumPy-Addition ist jedoch eine Modulo-Operation für uint8-Arrays wie Bilder. Weitere Informationen finden Sie im Artikel Unterschied zwischen Matrix-Arithmetik in OpenCV und Numpy .

Die zurückgegebenen Konturen sind Listen von Numpy-Arrays. Eine ausführliche Diskussion zu Konturen finden Sie in Konturen - 1: Erste Schritte .

Kurz gesagt, mit cv2 ist alles vereinfacht und ziemlich schnell.

Eine einfache Diskussion darüber, wie NumPy beschleunigt cv2wird, finden Sie in der Frage zum Stapelüberlauf . Leistungsvergleich von OpenCV-Python-Schnittstellen, cv und cv2 .

pyopencv :

Ich weiß nicht viel darüber, da ich es nicht benutzt habe. Aber es scheint die weitere Entwicklung gestoppt zu haben.

Ich denke, es wäre besser, an offiziellen Bibliotheken festzuhalten.

Kurz gesagt, ich würde Ihnen empfehlen, cv2 zu verwenden!

BEARBEITEN: Die Installationsprozedur für das cv2Modul finden Sie unter Installieren von OpenCV in Windows for Python .

Abid Rahman K.
quelle
Die cv2-Python-Oberfläche wird kompiliert und installiert, wenn Sie OpenCV aus den Quellen erstellen. Wenn Sie Binärpakete für Linux oder ein anderes Betriebssystem verwenden, sollten Sie die Dokumentation zu Ihrem Betriebssystem / Ihrer Distribution konsultieren. Hilfe finden Sie unter goo.gl/MUjXi .
TH.
1
@Framester: Siehe Installationsverfahren für cv2 in diesem Link: opencvpython.blogspot.in/2012/05/…
Abid Rahman K
Abids Antwort ist großartig. Um noch einen Punkt hinzuzufügen: Ich habe ein Projekt mit Python 3.x durchgeführt und konnte nur über ctypes_opencv und das ursprüngliche OpenCV 1.0 auf opencv zugreifen. Es behauptet Unterstützung für OpenCV pre1.1, aber ich habe es nie zum Laufen gebracht. Damit verwenden Sie die ursprüngliche cvSetROI usw. C-Typ-Schnittstelle.
KobeJohn