Używam OpenCV, a także chcę dodać kilka fajnych funkcji z mlpack, który używa macierzy Armadillo.Konwersja między cv :: Mat i arma :: mat
Czy istnieje łatwy sposób konwekcji między cv :: Mat i arms :: mat?
Dzięki!
Używam OpenCV, a także chcę dodać kilka fajnych funkcji z mlpack, który używa macierzy Armadillo.Konwersja między cv :: Mat i arma :: mat
Czy istnieje łatwy sposób konwekcji między cv :: Mat i arms :: mat?
Dzięki!
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())
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
To działa! Dziękuję, a-Jays! Ale czy istnieje sposób na konwersję z arma :: mat na cv :: Mat? – wking
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. –