Alle Google-Ergebnisse für openCV geben den gleichen Status an: Dieser Python ist nur geringfügig langsamer. Aber ich habe kein einziges Mal ein Profiling dazu gesehen. Also entschied ich mich für einige und entdeckte:
Python ist mit opencv deutlich langsamer als C ++, selbst für triviale Programme.
Das einfachste Beispiel, das ich mir vorstellen konnte, war, die Ausgabe einer Webcam auf dem Bildschirm anzuzeigen und die Anzahl der Bilder pro Sekunde anzuzeigen. Mit Python erreichte ich 50 FPS (auf einem Intel-Atom). Mit C ++ habe ich 65 FPS erhalten, eine Steigerung von 25%. In beiden Fällen verwendete die CPU-Auslastung einen einzigen Kern und war meines Wissens an die Leistung der CPU gebunden. Außerdem stimmt dieser Testfall mit dem überein, was ich in Projekten gesehen habe, die ich in der Vergangenheit von einem zum anderen portiert habe.
Woher kommt dieser Unterschied? In Python geben alle openCV-Funktionen neue Kopien der Bildmatrizen zurück. Wann immer Sie ein Bild aufnehmen oder dessen Größe ändern - in C ++ können Sie den vorhandenen Speicher wiederverwenden. In Python können Sie nicht. Ich vermute, dass diese Zeit für die Zuweisung von Speicher der Hauptunterschied ist, denn wie andere gesagt haben: Der zugrunde liegende Code von openCV ist C ++.
Bevor Sie Python aus dem Fenster werfen: Python lässt sich viel schneller entwickeln. Wenn Sie nicht auf Hardwareeinschränkungen stoßen oder wenn die Entwicklungsgeschwindigkeit wichtiger ist als die Leistung, verwenden Sie Python. In vielen Anwendungen, die ich mit openCV ausgeführt habe, habe ich in Python begonnen und später nur die Computer Vision-Komponenten in C ++ konvertiert (z. B. mithilfe des ctype-Moduls von Python und Kompilieren des CV-Codes in eine gemeinsam genutzte Bibliothek).
Python-Code:
import cv2
import time
FPS_SMOOTHING = 0.9
cap = cv2.VideoCapture(2)
fps = 0.0
prev = time.time()
while True:
now = time.time()
fps = (fps*FPS_SMOOTHING + (1/(now - prev))*(1.0 - FPS_SMOOTHING))
prev = now
print("fps: {:.1f}".format(fps))
got, frame = cap.read()
if got:
cv2.imshow("asdf", frame)
if (cv2.waitKey(2) == 27):
break
C ++ - Code:
#include <opencv2/opencv.hpp>
#include <stdint.h>
using namespace std;
using namespace cv;
#define FPS_SMOOTHING 0.9
int main(int argc, char** argv){
VideoCapture cap(2);
Mat frame;
float fps = 0.0;
double prev = clock();
while (true){
double now = (clock()/(double)CLOCKS_PER_SEC);
fps = (fps*FPS_SMOOTHING + (1/(now - prev))*(1.0 - FPS_SMOOTHING));
prev = now;
printf("fps: %.1f\n", fps);
if (cap.isOpened()){
cap.read(frame);
}
imshow("asdf", frame);
if (waitKey(2) == 27){
break;
}
}
}
Mögliche Benchmark-Einschränkungen:
- Bildrate der Kamera
- Timer Messgenauigkeit
- Zeitaufwand für die Druckformatierung
C
ohnehin hinter den Kulissen vom OpenCV- Code erledigt. Vorausgesetzt , Ihr eigener Code ist nicht zu aufwendig, sollte der Unterschied nicht so groß sein, wie Sie es naiv erwarten würden.