Sto usando OpenCV e voglio anche aggiungere alcune funzioni interessanti da , che utilizza le matrici Armadillo.Conversione tra cv :: Mat e arma :: mat
C'è un modo semplice per convocare tra cv :: Mat e arms :: mat?
Grazie!
Sto usando OpenCV e voglio anche aggiungere alcune funzioni interessanti da , che utilizza le matrici Armadillo.Conversione tra cv :: Mat e arma :: mat
C'è un modo semplice per convocare tra cv :: Mat e arms :: mat?
Grazie!
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())
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
Funziona! Grazie, a-Jays! Ma c'è un modo per convertire da arma :: mat a cv :: Mat? – wking
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. –