2014-11-17 16 views

Trả lời

10

OpenCV's Mat có con trỏ đến dữ liệu của nó. Armadillo có một nhà xây dựng có khả năng đọc từ dữ liệu bên ngoài. Thật dễ dàng để đặt chúng lại với nhau. Hãy nhớ rằng Armadillo lưu trữ theo thứ tự cột lớn, trong khi OpenCV sử dụng hàng chính. Tôi cho rằng bạn sẽ cần phải thêm một bước khác để chuyển đổi, trước hoặc sau.

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) 

Các cv::Mat constructor có một hình thức chấp nhận con trỏ đến dữ liệu, và arma::mat có chức năng cho một con trỏ * đúp để dữ liệu của nó được gọi là memptr().

Vì vậy, nếu bạn muốn chuyển đổi arma::mat-cv::Mat, điều này sẽ làm việc:

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

Mã bạn đã đăng thực hiện một chuyển vị tiềm ẩn, vì vậy nếu bạn có một ma trận OpenCV đó là row- lớn (tức là một quan sát mỗi hàng), sau đó ma trận Armadillo bạn lấy lại là cột chính (một quan sát trên mỗi cột). Điều này thật may mắn vì mlpack mong đợi dữ liệu chính của cột cho các thuật toán của nó. :) – ryan

+0

Nó hoạt động! Cảm ơn bạn, a-Jays! Nhưng có cách nào để chuyển đổi từ arma :: mat to cv :: Mat? – wking

+3

Hàm tạo 'c :: Mat' có một biểu mẫu chấp nhận con trỏ tới dữ liệu và' arma :: mat' có hàm cho một con trỏ 'double *' tới dữ liệu của nó được gọi là 'memptr()'. Vì vậy, 'cv :: Mat opencv_mat (hàng, cols, CV_64FC1, arma_mat.memptr())' nên hoạt động. Ngoài ra, hãy cân nhắc đánh dấu câu trả lời được chấp nhận nếu nó giải quyết được vấn đề. –

Các vấn đề liên quan