2015-04-20 7 views
8

La mia libreria attualmente utilizza OpenCV 2. Ora, sto cercando di compilare la libreria per utilizzare OpenCV 3. Sembra che alcuni file di intestazione siano stati spostati e alcune costanti siano state rinominate. Ad esempio, CV_INTER_LINEAR non è definito in OpenCV 3.Mantenimento della compatibilità di codice tra OpenCV 2 e OpenCV 3

Poiché la mia libreria deve essere compilata ed eseguita su OpenCV 2 e 3, esiste un modo semplice per superare questa incompatibilità?
Posso cambiare il mio codice, ma poi non funziona in OpenCV 2.

+0

Ciao, hai controllato './Modules/imgproc/include/opencv2/imgproc/types_c.h'? – lanpa

risposta

5

Ho avuto lo stesso problema alcuni mesi fa, e devo contraddire Kiran: ho ottenuto il mio progetto relativamente grande per costruire entrambi con OpenCv 2 e 3. Essere in grado di costruire con entrambi 2 e 3 è molto importante in un fase di transizione del progetto, soprattutto perché OpenCV 3 non è ancora in versione stabile, eppure ha incredibili funzioni di ottimizzazione.

Non è cv::INTER_LINEAR definito in OpenCV 2 (intestazione imgproc/imgproc.hpp) e 3? Dovrai sostituire alcuni nomi costanti, aggiungere un paio di inclusioni, ma non sarà troppo difficile.

Per quanto riguarda inclusioni di intestazione, c'è un modo per trovare un percorso compreso compatibili sia per Opencv2 e 3.

Dal link Kiran posted:

In OpenCV 3 scriviamo

#include "opencv2/core.hpp" 

invece di

#include "opencv2/core/core.hpp" 

Anche il vecchio metodo dovrebbe funzionare.


Aggiorna
Nel new Release Candidate, it's reported hanno migliorato la compatibilità tra OpenCV 2.4 e 3.x

migliorata compatibilità con OpenCV 2.4:

  • 2.4.11 ora include "opencv2/core.hpp" e altre intestazioni di questo tipo oltre allo standard "opencv2/core/core.hpp".
  • puntatori intelligenti (PTR <>) possono ora essere creati sia in stile 2.4 e 3.0 (nuova NomeClasse (params) vs makePtr (params))
  • modelli stat preparati e memorizzati dal opencv_ml 2.4 possono ora essere caricati e usato da opencv_ml 3.0 come-è.
  • la guida 2.4 => 3.0 transizione è stata abbozzata: http://docs.opencv.org/master/db/dfa/tutorial_transition_guide.html
5

MODIFICA: - Leggi la risposta di Antonio. È possibile includere l'intestazione di compatibilità types_c.h (1) e utilizzare i nomi costanti di OpenCV 2 che funzionano anche in OpenCV 3. Questo perché, anche se i nomi costanti differiscono (ad esempio INTER_LINEAR vs CV_INTER_LINEAR), i valori costanti rimangono gli stessi (2). Quindi le funzioni che accettano valori interi di const non dovrebbero comportarsi in modo diverso in OpenCV 2 e 3. Lo stesso vale per altre costanti. In questo modo devi solo cambiare i percorsi di intestazione tra OpenCV 2 e 3.

VECCHIA RISPOSTA: - Questo non è possibile. OpenCV 3 non è completamente compatibile con OpenCV 2. Dovrai modificare enumeri, percorsi di intestazione ecc tra OpenCV 2 e 3. Vedi Registro modifiche (3) per le sezioni sulla compatibilità con le versioni precedenti.

Si potrebbe provare a copiare le cose come le intestazioni in giro, dando numeri invece di nomi di costanti, utilizzando #ifdefs tutto il codice - ma prima o poi, che sta per fallire. Suggerisco di mantenere copie separate e avere la pace della mente. Preferirei ignorare completamente OpenCV 2 a meno che non sia attualmente in produzione.

+0

Grazie, ma questo non va bene per gli sviluppatori di opencv. Dovrebbero avere un modo per mantenere il codice scritto per V2 e renderlo compatibile con V3. – mans

+2

@mans Se ogni sviluppatore di librerie pensava così, useremo ancora OpenGL 1. Più di una specifica, ancora. – Kiran

0

L'OpenCV ragazzi hanno messo su una guida di transizione in linea: http://docs.opencv.org/master/db/dfa/tutorial_transition_guide.html

In sostanza penso che il seguente sono cambiati: -

  • ml module-> L'esistenza di StatModel in OpenCV 3 e che è la radice di tutti i classificatori.
  • features2d e xfeatures2d -> SIFT e un paio di altri si sono trasferiti da essere nel repository nucleo al opencv_contrib repo
  • E molti altri io non sono a conoscenza di

Per quanto riguarda il codice di lavorare con Opencv3 e opencv2, di solito introdurre una direttiva prepocessor che detiene una bandiera: -

#define HAS_OPENCV3 1 
#ifdef HAS_OPENCV3 
#include <opencv2/core.hpp> //Any OPENCV3 code 
#else 
#include <opencv2/core/core.hpp> //Any Opencv2 code 
#endif 

dato che le porzioni relativi vengono eliminati prima della compilazione, sarà anche compilare con solo le librerie openCV2 o OpenCV3. Ma, introduce molta ridondanza (che può essere evitata con una codifica intelligente).