【问题标题】:Conversion between cv::Mat and arma::matcv::Mat 和 arma::mat 之间的转换
【发布时间】:2015-01-14 10:34:15
【问题描述】:

我正在使用 OpenCV,还想从 mlpack 添加一些很酷的函数,它正在使用 Armadillo 矩阵。

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

谢谢!

【问题讨论】:

    标签: opencv type-conversion armadillo mlpack


    【解决方案1】:

    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 有一个用于指向其数据的 double* 指针的函数,称为 mempr()。

    所以,如果您想从 arma::mat 转换为 cv::Mat,这应该可以:

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

    【讨论】:

    • 您发布的代码执行隐式转置,因此如果您有一个行主要的 OpenCV 矩阵(即每行一个观察值),那么您返回的犰狳矩阵是列主要的(每列一个观察值)。这是幸运的,因为 mlpack 期望其算法使用列主要数据。 :)
    • 有效!谢谢你,杰斯!但是有没有办法从 arma::mat 转换为 cv::Mat?
    • cv::Mat 构造函数有一个接受指向数据的指针的形式,arma::mat 有一个函数,用于指向其数据的double* 指针,称为memptr()。所以,cv::Mat opencv_mat( rows, cols, CV_64FC1, arma_mat.memptr() ) 应该可以工作。此外,如果答案解决了问题,请考虑将其标记为接受。
    • 只是一个错字,我发现它应该是reinterpret_cast&lt;double*&gt;(opencv_mat.data),至少在我的编译器中是这样。除此之外,它工作正常,谢谢!
    猜你喜欢
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    相关资源
    最近更新 更多