Aufrechterhaltung der Code-Kompatibilität zwischen OpenCV 2 und OpenCV 3

8

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.

    
mans 20.04.2015, 14:26
quelle

3 Antworten

5

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: Ссылка
  •   
    
Antonio 20.04.2015, 19:28
quelle
5

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.

    
Kiran 20.04.2015 15:09
quelle
0

Die OpenCV-Jungs haben online einen Leitfaden für den Übergang erstellt: Ссылка

Im Wesentlichen glaube ich Folgendes geändert zu haben: -

  • ml Modul- & gt; Die Existenz von StatModel in OpenCV 3 und die Wurzel für alle Klassifikatoren.
  • features2d und xfeatures2d - & gt; SIFT und einige andere sind vom Core-Repository zum opencv_contrib-Repo
  • gewechselt
  • Und viele andere sind mir nicht bekannt

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).

    
Semicolon Warrier 07.05.2015 15:05
quelle

Tags und Links