Tôi đang sử dụng OpenCV và cũng muốn thêm một số chức năng tuyệt vời từ mlpack, sử dụng ma trận Armadillo.Chuyển đổi giữa cv :: Mat và arma :: mat
Có cách nào dễ dàng để convet giữa cv :: Mat và cánh tay :: mat?
Cảm ơn!
Tôi đang sử dụng OpenCV và cũng muốn thêm một số chức năng tuyệt vời từ mlpack, sử dụng ma trận Armadillo.Chuyển đổi giữa cv :: Mat và arma :: mat
Có cách nào dễ dàng để convet giữa cv :: Mat và cánh tay :: mat?
Cảm ơn!
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())
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
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
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 đề. –