cv::Mat和arma::mat之间的转换

10

我正在使用OpenCV,同时想要添加一些来自mlpack的炫酷功能,该库使用Armadillo矩阵。

是否有一种简单的方法可以在cv::Mat和arma::mat之间进行转换?

谢谢!

1个回答

16
OpenCV的`Mat`类有一个指向其数据的指针。Armadillo有一个构造函数,可以从外部数据中读取。将它们组合在一起很容易。请记住,Armadillo以列主序存储,而OpenCV使用行主序。我想你可能需要在之前或之后添加另一个转换步骤。
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 )


    
cv::Mat的构造函数有一个接受数据指针的形式,而arma::mat有一个名为memptr()的函数,用于返回其数据的double*指针。
因此,如果你想将arma::mat转换为cv::Mat,可以使用以下方法:
cv::Mat opencv_mat( rows, cols, CV_64FC1, arma_mat.memptr() )

3
你所发布的代码执行了一次隐式转置,因此如果你有一个按行存储的OpenCV矩阵(即每行为一个观测值),那么你得到的Armadillo矩阵是按列存储的(每列为一个观测值)。这很幸运,因为mlpack算法需要按列存储的数据。 :) - ryan
成功了!谢谢,a-Jays!但是有没有一种方法可以将arma :: mat转换为cv :: Mat? - wking
3
cv::Mat的构造函数可以接受一个数据指针,而arma::mat有一个返回double*指向其数据的函数,名为memptr()。因此,cv::Mat opencv_mat( rows, cols, CV_64FC1, arma_mat.memptr() )应该能够工作。如果解决了问题,请考虑标记答案为已接受。 - a-Jays
1
我发现了一个拼写错误,应该是reinterpret_cast<double*>(opencv_mat.data),至少在我的编译器中是这样。除此之外,它工作得很好,谢谢! - dim_tz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接