Maintien de la compatibilité du code entre OpenCV 2 et OpenCV 3

Ma bibliothèque utilise actuellement OpenCV 2. Maintenant, j’essaie de comstackr la bibliothèque pour utiliser OpenCV 3. Il semble que certains fichiers d’en-tête ont été déplacés et que certaines constantes aient été renommées. Par exemple, CV_INTER_LINEAR n’est pas défini dans OpenCV 3.

Comme ma bibliothèque doit être compilée et exécutée sous OpenCV 2 et 3, existe-t-il un moyen simple de surmonter cette incompatibilité?
Je peux modifier mon code, mais cela ne fonctionne pas dans OpenCV 2.

J’ai eu le même problème il ya quelques mois et je dois contredire Kiran: j’ai construit mon projet relativement volumineux avec OpenCv 2 et 3. Pouvoir construire avec les versions 2 et 3 est très important dans une phase de transition du projet, surtout parce qu’OpenCV 3 n’est pas encore en version stable et qu’il possède des fonctionnalités d’optimisation étonnantes.

cv::INTER_LINEAR n’est-il pas défini à la fois dans OpenCV 2 (en-tête imgproc/imgproc.hpp ) et 3? Vous devrez remplacer certains noms de constantes, append quelques inclusions, mais cela ne sera pas trop difficile.

En ce qui concerne les inclusions d’en-têtes, il existe un moyen de trouver un chemin d’inclusion compatible à la fois pour Opencv2 et 3.

Depuis le lien que Kiran a posté :

Dans OpenCV 3 nous écrivons

 #include "opencv2/core.hpp" 

au lieu de

 #include "opencv2/core/core.hpp" 

L’ancienne méthode devrait également fonctionner.

Mettre à jour
Dans la nouvelle version candidate , il est indiqué qu’ils ont amélioré la compatibilité entre OpenCV 2.4 et 3.x

Compatibilité améliorée avec OpenCV 2.4:

  • 2.4.11 inclut maintenant “opencv2 / core.hpp” et d’autres en-têtes de ce type en plus de la norme “opencv2 / core / core.hpp”.
  • Les pointeurs intelligents (Ptr <>) peuvent maintenant être créés dans les styles 2.4 et 3.0 (nouveau ClassName (params) vs makePtr (params))
  • Les modèles statistiques formés et stockés depuis opencv_ml 2.4 peuvent désormais être chargés et utilisés par opencv_ml 3.0 en l’état.
  • le guide de transition 2.4 => 3.0 a été esquissé: http://docs.opencv.org/master/db/dfa/tutorial_transition_guide.html

EDIT: – Lisez la réponse d’Antonio. Vous pouvez inclure l’en-tête de compatibilité types_c.h ( 1 ) et utiliser les noms de constante OpenCV 2, qui fonctionnent également dans OpenCV 3. En effet, même si les noms des constantes diffèrent (par exemple, INTER_LINEAR vs CV_INTER_LINEAR ), les valeurs constantes restnt les mêmes ( 2 ). Ainsi, les fonctions acceptant des valeurs const entières ne devraient pas se comporter différemment dans OpenCV 2 et 3. Il en va de même pour les autres constantes. De cette façon, il vous suffit de modifier les chemins d’en-tête entre OpenCV 2 et 3.

ANCIENNE REPONSE: – Ce n’est pas possible. OpenCV 3 n’est pas totalement compatible avec OpenCV 2. Vous devrez modifier les énumérations, les chemins d’en-tête, etc. entre OpenCV 2 et 3. Voir Changelog ( 3 ) pour les sections sur la compatibilité ascendante.

Vous pouvez essayer, par exemple, de copier les en-têtes, de donner des chiffres plutôt que des noms constants, d’utiliser #ifdefs tout votre code – mais tôt ou tard, cela échouera . Je suggère de conserver des copies séparées et d’avoir l’esprit tranquille. Je préférerais ignorer complètement OpenCV 2, sauf si je suis actuellement en production.

Les gars d’OpenCV ont mis en place un guide de transition en ligne: http://docs.opencv.org/master/db/dfa/tutorial_transition_guide.html

En substance, je pense que les éléments suivants ont changé: –

  • ml module-> L’existence de StatModel dans OpenCV 3 et la racine de tous les classificateurs.
  • features2d et xfeatures2d -> SIFT et quelques autres sont passés du référentiel principal au référentiel opencv_consortingb
  • Et beaucoup d’autres que je ne connais pas

En ce qui concerne le code fonctionnant avec Opencv3 et opencv2, j’introduis généralement une directive de pré-traitement qui contient un drapeau: –

 #define HAS_OPENCV3 1 #ifdef HAS_OPENCV3 #include  //Any OPENCV3 code #else #include  //Any Opencv2 code #endif 

Puisque les portions relatives sont éliminées avant la compilation, il sera également compilé avec les bibliothèques OpenCV2 ou OpenCV3 uniquement. Mais, introduit beaucoup de redondance (ce qui peut être évité par un codage intelligent).