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

问题描述 投票:1回答:1

大家好,我正在做一个程序,计算图像的特征值和特征向量。为此,我使用的是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个回答
0
投票

除非您真的知道自己在做什么,否则请不要使用重新解释类型转换。请参阅this question的可接受答案,以对其功能进行很好的说明。


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

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

© www.soinside.com 2019 - 2024. All rights reserved.