2014-11-17 13 views

risposta

10

OpenCV's Mat ha un puntatore ai suoi dati. Armadillo ha un costruttore che è in grado di leggere da dati esterni. È facile metterli insieme. Ricorda che Armadillo memorizza nell'ordine delle colonne, mentre OpenCV usa la riga maggiore. Suppongo che dovrai aggiungere un altro passaggio per la trasformazione, prima o dopo.

cv::Mat opencv_mat; //opencv's mat, already transposed. 
arma::mat arma_mat(reinterpret_cast<double*>opencv_mat.data, opencv_mat.rows, opencv_mat.cols) 

Il cv::Mat costruttore ha una forma che accetta puntatore ai dati e arma::mat ha una funzione per un * doppio puntatore ai suoi dati denominato memptr().

Quindi, se si desidera convertire arma::mat-cv::Mat, questo dovrebbe funzionare:

cv::Mat opencv_mat(rows, cols, CV_64FC1, arma_mat.memptr()) 
+2

Il codice che hai postato esegue una trasposizione implicita, quindi se avete una matrice OpenCV che è row- maggiore (cioè un'osservazione per riga), quindi la matrice di armadillo che si ottiene è colonna maggiore (un'osservazione per colonna). Questo è un vantaggio perché mlpack si aspetta che i dati più importanti per la colonna siano i suoi algoritmi. :) – ryan

+0

Funziona! Grazie, a-Jays! Ma c'è un modo per convertire da arma :: mat a cv :: Mat? – wking

+3

Il costruttore 'cv :: Mat' ha una forma che accetta il puntatore ai dati, e' arma :: mat' ha una funzione per un puntatore 'double *' ai suoi dati chiamati 'memptr()'. Quindi, 'cv :: Mat opencv_mat (rows, cols, CV_64FC1, arma_mat.memptr())' dovrebbe funzionare. Inoltre, considera di contrassegnare una risposta accettata se risolve il problema. –