Meine Bibliothek benutzt derzeit OpenCV 2. Jetzt versuche ich die Bibliothek zu kompilieren, um OpenCV 3 zu benutzen. Es scheint, dass einige Header-Dateien verschoben wurden und einige Konstanten umbenannt wurden. Zum Beispiel ist CV_INTER_LINEAR
in OpenCV 3 nicht definiert.
Da meine Bibliothek kompiliert und sowohl auf OpenCV 2 als auch auf 3 ausgeführt werden muss, gibt es einen einfachen Weg, diese Inkompatibilität zu überwinden?
Ich kann meinen Code ändern, funktioniert aber nicht in OpenCV 2.
Ich hatte vor ein paar Monaten das selbe Problem, und ich muss Kiran widersprechen: Ich habe mein relativ großes Projekt, mit OpenCv 2 und 3 zu bauen. Die Fähigkeit, mit 2 und 3 zu bauen, ist in einem Projekt sehr wichtig Übergangsphase, vor allem weil OpenCV 3 noch nicht in einer stabilen Version ist und dennoch über erstaunliche Optimierungsfunktionen verfügt.
Ist nicht cv::INTER_LINEAR
in OpenCV 2 (Header imgproc/imgproc.hpp
) und 3 definiert? Sie müssen einige konstante Namen ersetzen, fügen Sie ein paar Einschlüsse hinzu, aber das wird nicht zu schwer sein.
Bezüglich der Header-Einschlüsse gibt es eine Möglichkeit, einen Include-Pfad zu finden, der sowohl für Opencv2 als auch für OpenCv2 kompatibel ist.
Aus dem Link, den Kiran gepostet hat :
In OpenCV 3 schreiben wir
%Vor%statt
%Vor%Die alte Methode sollte auch funktionieren.
Aktualisieren
Im neuen Release Candidate , Es wurde berichtet , dass sie die Kompatibilität zwischen OpenCV 2.4 und 3.x verbessert haben
Verbesserte Kompatibilität mit OpenCV 2.4:
- 2.4.11 enthält jetzt "opencv2 / core.hpp" und andere solche Header zusätzlich zum Standard "opencv2 / core / core.hpp".
- intelligente Zeiger (Ptr & lt; & gt;) kann jetzt im Stil 2.4 und 3.0 erstellt werden (neuer ClassName (params) vs makePtr (params))
- trainierte und speicherte Statistikmodelle von opencv_ml 2.4 kann jetzt von opencv_ml 3.0 wie es ist geladen und benutzt werden.
- die 2.4 = & gt; 3.0-Übergangsleitfaden wurde skizziert: Ссылка
EDIT: - Lesen Sie Antonio's Antwort. Sie können den Kompatibilitätsheader types_c.h
einschließen ( 1 ) und verwende OpenCV 2 Konstantennamen, die auch in OpenCV 3 funktionieren. Dies ist so, da, obwohl sich konstante Namen unterscheiden (zB INTER_LINEAR
vs CV_INTER_LINEAR
), konstante Werte gleich bleiben ( 2 ). Also sollten Funktionen, die ganzzahlige const-Werte annehmen, sich in OpenCV 2 und 3 nicht anders verhalten. Das gleiche gilt für andere Konstanten. Auf diese Weise müssen Sie nur die Kopfpfade zwischen OpenCV 2 und 3 ändern.
ALTE ANTWORT: - Dies ist nicht möglich. OpenCV 3 ist nicht vollständig abwärtskompatibel zu OpenCV 2. Sie müssen Enums, Header-Pfade usw. zwischen OpenCV 2 und 3 ändern. Siehe Changelog ( 3 ) für Abschnitte über die Abwärtskompatibilität.
Sie könnten Dinge wie das Kopieren von Headern versuchen, indem Sie Zahlen anstelle von konstanten Namen verwenden, indem Sie #ifdefs
im gesamten Code verwenden - aber früher oder später wird das scheitern . Ich schlage vor, getrennte Kopien zu behalten und Ruhe zu haben. Ich würde OpenCV 2 lieber ignorieren, wenn ich nicht gerade in Produktion bin.
Die OpenCV-Jungs haben online einen Leitfaden für den Übergang erstellt: Ссылка
Im Wesentlichen glaube ich Folgendes geändert zu haben: -
Wie bei Code, der mit Opencv3 und opencv2 arbeitet, führe ich normalerweise eine Präprozessor-Direktive ein, die ein Flag enthält: -
%Vor%Da die relativen Teile vor der Kompilierung eliminiert werden, wird es auch nur mit den OpenCV2- oder OpenCV3-Bibliotheken kompiliert. Aber, führt eine Menge Redundanz ein (was durch eine clevere Codierung vermieden werden kann).