从 cv::Mat 转换为 arma::mat

Convert from cv::Mat to arma::mat

大家好,我正在做一个计算图像的特征值和特征向量的程序。为此,我使用 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) 有谁知道为什么会这样?

除非你真的知道自己在做什么,否则不要使用 reinterpret cast。请参阅 this question 的已接受答案,以获得对其作用的良好解释。


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

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