OpenCV (JavaCV) vs. OpenCV (C/C++-Schnittstellen)

Lesezeit: 6 Minuten

Ich frage mich nur, ob es bei der Verwendung von JavaCV im Gegensatz zur C/C++-Implementierung von OpenCV auf einer bestimmten Gruppe von Computern einen signifikanten Geschwindigkeitsleistungsvorteil geben würde.

Bitte korrigieren Sie mich, wenn ich falsch liege, aber ich verstehe, dass die c/c++-Implementierung von opencv näher an der Maschine ist, wo die Java-Implementierung von OpenCV, JavaC, einen leichten Geschwindigkeitsleistungsnachteil (in Millisekunden) hätte, wie es der Fall wäre eine virtuelle Maschine, die Ihren Quellcode in Bytecode konvertiert, der dann in Maschinencode konvertiert wird. Wohingegen es mit c/c++ direkt in Maschinencode konvertiert wird und somit diesen Zwischenschritt des Overheads der virtuellen Maschine nicht trägt.

Bitte bringt mich hier nicht um, wenn ich Fehler gemacht habe; Ich lerne gerade und freue mich über konstruktive Kritik.

Vielen Dank

  • Aber Java ist plattformunabhängig, während C/C++ plattformabhängig ist.

    – praveen_mohan

    18. Januar 2014 um 18:02 Uhr

  • und weniger Probleme, opencv lib funktioniert mit maven :p

    – Milach

    17. August 2018 um 3:20 Uhr

Benutzer-Avatar
Freund

Ich möchte der Antwort von @ ejbs ein paar Dinge hinzufügen.

Zunächst einmal ging es Ihnen um zwei getrennte Probleme:

  1. Java vs. C++-Leistung
  2. OpenCV vs. JavaCV

Java vs. C++ Leistung ist eine lange, lange Geschichte. Auf der einen Seite, C++-Programme werden zu a kompiliert hochoptimierter nativer Code. Sie starten schnell und laufen die ganze Zeit schnell, ohne für die Garbage Collection oder andere VM-Aufgaben anzuhalten (wie es Java tut). Andererseits können einmal kompilierte Programme in C++ nicht mehr geändert werden, egal auf welcher Maschine sie ausgeführt werden Java-Bytecode wird zusammengestellt“gerade rechtzeitig„Und ist immer optimiert für Prozessorarchitektur sie laufen weiter. In der modernen Welt mit so vielen verschiedenen Geräten (und Prozessorarchitekturen) kann dies wirklich wichtig sein. Darüber hinaus können einige JVMs (z. B. Oracle Hotspot) sogar den Code optimieren, der bereits zu nativem Code kompiliert wurde! VM sammelt Daten über die Programmausführung und versucht von Zeit zu Zeit, Code so umzuschreiben, dass er dafür optimiert ist diese konkrete Ausführung. Unter solch komplizierten Umständen besteht die einzige wirkliche Möglichkeit, die Leistung von Implementierungen in verschiedenen Programmiersprachen zu vergleichen, darin, sie einfach auszuführen und das Ergebnis zu sehen.

OpenCV vs. JavaCV ist eine andere Geschichte. Zuerst müssen Sie den Stapel von Technologien hinter diesen Bibliotheken verstehen.

OpenCV wurde ursprünglich 1999 in den Forschungslabors von Intel entwickelt und in C geschrieben. Seitdem wechselte es mehrmals den Betreuer, wurde Open Source und erreichte die 3. Version (kommende Veröffentlichung). Im Moment ist der Kern der Bibliothek in C++ mit einer beliebten Schnittstelle in Python und einer Reihe von Wrappern in anderen Programmiersprachen geschrieben.

JavaCV ist einer dieser Wrapper. Wenn Sie also ein Programm mit JavaCV ausführen, verwenden Sie in den meisten Fällen auch OpenCV, rufen Sie es einfach über eine andere Schnittstelle auf. Aber JavaCV bietet mehr als nur einen Eins-zu-Eins-Wrapper um OpenCV. Tatsächlich bündelt es die gesamte Anzahl von Bildverarbeitungsbibliotheken, einschließlich FFmpeg, OpenKinect und andere. (Beachten Sie, dass Sie diese Bibliotheken in C++ auch binden können).

Im Allgemeinen spielt es also keine Rolle, was Sie verwenden – OpenCV oder JavaCV – Sie erhalten ungefähr die gleiche Leistung. Es hängt mehr von Ihrer Hauptaufgabe ab – ist es Java oder C++, was für Ihre Bedürfnisse besser geeignet ist.

Es gibt noch einen weiteren wichtigen Punkt zur Leistung. Wenn Sie OpenCV (direkt oder über Wrapper) verwenden, werden Sie manchmal feststellen, dass OpenCV-Funktionen andere Implementierungen um mehrere Größenordnungen übertreffen. Dies liegt an der starken Nutzung von Low-Level-Optimierungen in seinem Kern. Zum Beispiel OpenCVs filter2D Funktion ist SIMD-beschleunigt und kann somit mehrere Datensätze parallel verarbeiten. Und wenn es um Computer Vision geht, können solche Optimierungen gemeinsamer Funktionen leicht zu einer erheblichen Beschleunigung führen.

  • Eine sehr ausführliche Erklärung, danke, dass Sie sich die Zeit genommen haben.

    – Pelikan

    18. Januar 2014 um 19:45 Uhr


  • Das ist großartiges Zeug, ich meine, das ist gut erklärt, Sie haben gerade meine Frage beantwortet und mir die Zeit erspart, die ich hätte verbringen können, um nach einer so verständlichen Erklärung zu suchen.

    – Kinsley-Kajiva

    16. Februar 2017 um 17:28 Uhr

Benutzer-Avatar
ejbs

JavaCV-Schnittstellen zu OpenCV, wenn Sie also etwas OpenCV-bezogenes aufrufen, würde es einen gewissen Overhead geben, aber im Allgemeinen wird die meiste schwere Arbeit immer noch auf der C++-Seite liegen und daher wird es keine sehr große Leistungseinbuße geben.

Sie müssten Leistungsbenchmarks durchführen, um mehr herauszufinden.

PS. Ich bin ziemlich neu hier, aber ich bin mir ziemlich sicher, dass dies keine geeignete Frage für StackOverflow ist.

  • Warum denkst du, dass es nicht für SO geeignet ist?

    – Freund

    18. Januar 2014 um 18:06 Uhr

  • Ich bin mir nicht sicher genug, um dir einen guten Grund zu nennen, es war eher ein Bauchgefühl, fürchte ich.

    – ejbs

    18. Januar 2014 um 18:07 Uhr

  • Ja, ich kenne dieses Gefühl 🙂 Diese Frage ist jedoch konkret und kann eine konkrete Antwort haben, also denke ich, dass es in Ordnung ist.

    – Freund

    18. Januar 2014 um 18:09 Uhr

  • Danke auch ffriend und ejbs; Wäre die JavaCV-Schnittstelle in Fällen von Echtzeitanwendungen, in denen Sie beispielsweise Autos erkennen, die mit sehr hohen Geschwindigkeiten auf der Autobahn vorbeifliegen, immer noch schnell genug, um zu sagen, dieses Auto zu erfassen und die Zählung zu erhöhen? Ich weiß, ich bin dumm, Java ist sehr schnell, ich weiß, aber warum sollten sie uns eine ac/c++-Implementierung dieser Bibliothek anbieten? Ist es nicht b/c, es ist wirklich so schnell im Vergleich zu irgendetwas anderem (Java, Python)? Bitte korrigiere mich wenn ich falsch liege

    – Pelikan

    18. Januar 2014 um 18:27 Uhr


  • Ziemlich sicher, dass die ursprüngliche Implementierung in C++ war, also alles nur historische Gründe. Ich bin mir nicht sicher, ob es wahrscheinlich schnell genug wäre? Vergiss nicht, meine Antwort zu akzeptieren, wenn du zufrieden bist 😉

    – ejbs

    18. Januar 2014 um 18:28 Uhr


Ich möchte noch ein paar weitere Einblicke in Java als Schnittstelle zu C++-Bibliotheken hinzufügen …

A)Entwicklung:

1) Während Java möglicherweise einfacher zu verwalten ist, große Projekte zu verwalten und extrem schnell zu kompilieren, ist es sehr, sehr schwierig und nahezu unmöglich, nativen Code von Java zu debuggen …

Wenn Code auf nativer Seite zerquetscht wird … oder Speicherlecks (was häufig passiert …) fühlt man sich irgendwie hilflos …

2) Wenn Sie die Bindungen nicht selbst bauen (keine leichte Aufgabe, selbst mit Swig oder was auch immer …), sind Sie auf den guten Willen / die Gesundheit / die Zeit des Bindungsbauers angewiesen …. also würde ich in diesem Fall die bevorzugen offizielle “desktop java” bindungen über javacv …

B) Leistung.

1) Während Bindungen optimiert werden können (Speicherübertragung mit neobuffer ), wie im javacv-Fall, gibt es immer noch einen sehr sehr kleinen JNI-Overhead für jeden nativen Funktionsaufruf – dies ist in unserem Fall bedeutungslos, da die meisten opencv-Funktionen im Vergleich dazu X100000 ++ – CPU-Zyklen verbrauchen jni oben…

2) Das GROSSE PROBLEM —- stoppe die Welt GARBAGE COLLECTIOR ( GC )

java verwendet einen Garbage Collector, der alle CPU-Threads anhält, was es für ECHTZEIT-Anwendungen ungeeignet macht. Es gibt Workarounds, von denen ich gehört habe, wie das Umgestalten Ihrer App, um keinen Müll zu produzieren, die Verwendung eines räumlichen gc oder die Verwendung von Echtzeit-Java (kostet Geld … ) Sie scheinen alle zusätzliche Arbeit zu sein (und alles, was Sie wollten, ist ein schöner einfacher Pfad zu opencv …. )

Fazit – wenn Sie eine professionelle Echtzeit-App erstellen möchten, dann gehen Sie mit C++, es sei denn, Sie haben ein riesiges modulares Projekt zu verwalten – bleiben Sie einfach bei C++ und vorkompilierten Headern (beschleunigen Sie die Kompilierung …), während Java eine Freude ist zu arbeiten mit , wenn es um native Bindung geht, bricht die HÖLLE los … ich weiß, ich war dort ….

1354260cookie-checkOpenCV (JavaCV) vs. OpenCV (C/C++-Schnittstellen)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy