大家好,我正在做一个计算图像特征值和特征向量的程序。为此,我使用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),有人知道为什么会发生这种情况吗?
发布于 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>的别名)。在这种情况下,您将使用不同的构造函数。
https://stackoverflow.com/questions/58348428
复制相似问题