2014-11-17 23 views

Odpowiedz

10

OpenCV's Mat ma wskaźnik do swoich danych. Armadillo ma konstruktora, który jest zdolny do czytania z danych zewnętrznych. Łatwo je połączyć. Pamiętaj, że magazyny Armadillo są przechowywane w kolejności kolumnowej, podczas gdy OpenCV używa wiersza-major. Przypuszczam, że musisz dodać kolejny krok do transformacji, przed lub po.

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) 

Konstruktor cv::Mat ma postać, która przyjmuje wskaźnik do danych i arma::mat posiada funkcję podwójną * wskaźnik do swoich danych, nazywane memptr().

Tak więc, jeśli chcesz przekonwertować z arma::mat do cv::Mat, to powinno działać:

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

Kod pan pisał wykonuje niejawnego transpozycji, więc jeśli masz matrycę OpenCV to row- major (tj. jedna obserwacja w wierszu), następnie macierz pancerna, którą otrzymasz, jest kolumną główną (jedna obserwacja na kolumnę). To szczęście, ponieważ mlpack spodziewa się, że dane z kolumny będą duże dla swoich algorytmów. :) – ryan

+0

To działa! Dziękuję, a-Jays! Ale czy istnieje sposób na konwersję z arma :: mat na cv :: Mat? – wking

+3

Konstruktor 'cv :: Mat' ma postać, która akceptuje wskaźnik do danych, a' arma :: mat' ma funkcję dla wskaźnika 'double *' dla swoich danych zwanych 'memptr()'. Tak więc 'cv :: Mat opencv_mat (rows, cols, CV_64FC1, arma_mat.memptr())' powinien działać. Zastanów się również nad zaznaczeniem odpowiedzi, jeśli rozwiąże ona problem. –