Leistungsvergleich von OpenCV-Python-Schnittstellen, Lebenslauf und CV2

Ein paar Tage zurück, habe ich angefangen neue OpenCV-Python-Schnittstelle, cv2 .

Meine Frage cv2 sich auf den Vergleich von cv und cv2 Schnittstelle.

In Bezug auf die Benutzerfreundlichkeit, neue cv2 Schnittstelle hat sich weit größer verbessert, und es ist wirklich einfach und macht Spaß, mit cv2 zu arbeiten.

Aber was ist mit der Geschwindigkeit?

Ich habe zwei kleine Code-Snipplets, eine in cv und eine andere in cv2 , um die Aufführungen zu überprüfen. Beide machen die gleiche Funktion, greifen auf Pixel eines Bildes zu, testen es, machen einige Änderungen, etc.

Unten ist der Code:


cv2 interface :

 import time import numpy as np import cv2 gray = cv2.imread('sir.jpg',0) width = gray.shape[0] height = gray.shape[1] h = np.empty([width,height,3]) t = time.time() for i in xrange(width): for j in xrange(height): if gray[i,j]==127: h[i,j]=[255,255,255] elif gray[i,j]>127: h[i,j]=[0,0,255-gray[i,j]] else: h[i,j]=[gray[i,j],0,0] t2 = time.time()-t print "time taken = ",t2 

========================================== ===

Und Ergebnis ist:

Zeit genommen = 14.4029130936

========================================== ====

Cv-Schnittstelle:

 import cv,time gray = cv.LoadImage('sir.jpg',0) h = cv.CreateImage(cv.GetSize(gray),8,3) t=time.time() for i in xrange(gray.width): for j in xrange(gray.height): k = cv.Get2D(gray,j,i)[0] if k==127: cv.Set2D(h,j,i,(255,255,255)) elif k>127: cv.Set2D(h,j,i,(0,0,255-k)) else: cv.Set2D(h,j,i,(k,0,0)) t2 = time.time()-t print "time taken = ",t2 cv.ShowImage('img',h) cv.WaitKey(0) 

========================================== ====

Das Ergebnis ist:

Zeit genommen = 1.16368889809

========================================== =====

Sehen Sie, hier alte cv ist etwa 12 times faster als cv2 . Und daraus resultierende Bilder sind gleich. (Eingabebild ist von Größe 720×540)

Warum passiert das?

Ist cv2 langsamer im Vergleich zu cv?

Oder mache ich hier irgendwelche Fehler? Gibt es eine schnellere Methode in cv2 für den oben genannten Code?

One Solution collect form web for “Leistungsvergleich von OpenCV-Python-Schnittstellen, Lebenslauf und CV2”

Das von cv2.imread () zurückgegebene Bild ist ein Arrayobjekt von NumPy. So können Sie die Funktionen von NumPy nutzen, um die Berechnung zu beschleunigen.

Das folgende Programm zeigt, wie Sie Ihren Ursprung für die Loop-Version beschleunigen, indem Sie item (), Itemset () -Methode von ndarray-Objekt verwenden.

 import time import numpy as np import cv2 gray = cv2.imread('lena_full.jpg',0) height, width = gray.shape h = np.empty((height,width,3), np.uint8) t = time.time() for i in xrange(height): for j in xrange(width): k = gray.item(i, j) if k == 127: h.itemset(i, j, 0, 255) h.itemset(i, j, 1, 255) h.itemset(i, j, 2, 255) elif k > 127: h.itemset(i, j, 0, 0) h.itemset(i, j, 1, 0) h.itemset(i, j, 2, 255-k) else: h.itemset(i, j, 0, k) h.itemset(i, j, 1, 0) h.itemset(i, j, 2, 0) print time.time()-t 

Und das folgende Programm zeigt, wie die Palette zuerst zu erstellen, und verwenden Sie NumPy's Array-Index, um das Ergebnis zu erhalten:

 t = time.time() palette = [] for i in xrange(256): if i == 127: palette.append((255, 255, 255)) elif i > 127: palette.append((0,0,255-i)) else: palette.append((i, 0, 0)) palette = np.array(palette, np.uint8) h2 = palette[gray] print time.time() - t print np.all(h==h2) 

Die Ausgabe ist:

 0.453000068665 0.0309998989105 True 

Die Ausgabe der cv-Version ist:

 0.468999862671 

Anmerkung: Die Länge der Achse 0 ist die Höhe des Bildes, die Länge der Achse 1 ist die Breite des Bildes

  • Numpy Version von "Exponential gewichtet gleitenden Durchschnitt", entspricht pandas.ewm (). Mean ()
  • Entfernen Sie einen Wörterbuchschlüssel, wenn es sich um einen Teilstring in einer anderen Taste handelt
  • Ein schneller verschachteltes Tupel zur Liste und zurück
  • Scipy.spatial.ckdtree läuft langsam
  • PerformanceWarning - Pandas und Pytables, kann ich das beheben?
  • Konvertieren einer verschachtelten Schleifenberechnung zu Numpy für Beschleunigung
  • Überprüfen Sie die Laufzeit pro Zeile in Python
  • Wie kann ich meinen Python-Code schneller laufen lassen?
  • Wie lade die vorhandene db-Datei in den Speicher in Python sqlite3?
  • Ist die Leistung zwischen der Python- oder C ++ - Codierung von OpenCV unterschiedlich?
  • Python-Tensor-Produkt
  • Python ist die beste Programmiersprache der Welt.