【问题标题】:Convert from cv::Mat to arma::mat从 cv::Mat 转换为 arma::mat
【发布时间】:2020-02-09 09:43:11
【问题描述】:

大家好,我正在做一个计算图像特征值和特征向量的程序。为此,我使用 OpenCV 和 Armadillo 库,使用 OpenCV 将图像上传到我的程序,并使用 Armadillo 计算特征值和特征向量。

我需要从 cv::Mat 转换为 arma::mat 才能计算特征值和特征向量,为此我根据之前的答案执行以下操作:

arma::mat arma_mat(reinterpret_cast<double*>(image.data), image.rows, image.cols);

完整代码在这里:

#include<armadillo>
#include<opencv2/opencv.hpp>
#include<iostream>

int main()
{
    cv::Mat image = cv::imread("Imgs/face.jpg", CV_LOAD_IMAGE_GRAYSCALE);
    if(!image.data){
        std::cout << "No se pudo cargar la imágen\n";
        return -1;
    }

    arma::mat arma_mat(reinterpret_cast<double*>(image.data), image.rows, image.cols);

    return 0;
}

代码编译没有问题,但是当它执行时,当它到达从 cv::Mat 转换为 arma::mat 的行时,执行停止并出现控制台(退出值:-1) 有谁知道为什么会这样?

【问题讨论】:

    标签: c++ opencv armadillo


    【解决方案1】:

    除非您真的知道自己在做什么,否则不要使用重新解释演员表。请参阅this question 接受的答案,了解它的作用。


    我对opencv没有经验,只有犰狳。查看opencv documentation 我可以看到image.datauchar。你不能只是 reinterpret_cast 值加倍。这是未定义的行为,在这种情况下肯定是错误的。

    犰狳矩阵类 (arma::Mat) 是一个模板。您可以创建一个Mat&lt;uchar&gt; 并使用Mat&lt;uchar&gt;(ptr_aux_mem, n_rows, n_cols, copy_aux_mem = true, strict = false) 构造函数来避免复制元素。当然,您也可以使用其他犰狳类型,但在这种情况下,您需要复制元素才能转换为其他类型(例如arma::mat,它只是arma::Mat&lt;double&gt; 的别名)。在这种情况下,您将使用不同的构造函数。

    【讨论】:

    • OpenCV 使用 row-major order 和 Armadillo col-major order,因此您可能还想使用 arma_mat.t() 转置它
    猜你喜欢
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 2012-12-29
    • 2014-05-07
    相关资源
    最近更新 更多