首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由cv::Mat转换为arma::mat

由cv::Mat转换为arma::mat
EN

Stack Overflow用户
提问于 2019-10-11 21:04:14
回答 1查看 417关注 0票数 1

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

我需要从cv::Mat转换到arma::mat,以便能够计算特征值和特征向量,为此,我根据先前的答案做以下工作:

代码语言:javascript
复制
arma::mat arma_mat(reinterpret_cast<double*>(image.data), image.rows, image.cols);

完整的代码如下:

代码语言:javascript
复制
#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),有人知道为什么会发生这种情况吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-12 02:28:40

除非你真正知道自己在做什么,否则不要使用重释演员阵容。请参阅这个问题的公认答案,以获得对它所做工作的良好解释。

我没有使用opencv的经验,只对鲤鱼有经验。看看opencv文档,我可以看到image.data是一个uchar。您不能只是reinterpret_cast值加倍。这是一种未定义的行为,在这种情况下肯定是错误的。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58348428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档