c++ - 从 cv::Mat 转换为 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)有谁知道为什么会这样正在发生?
解决方案
除非您真的知道自己在做什么,否则不要使用重新解释演员表。请参阅此问题的已接受答案,以很好地解释它的作用。
我对opencv没有经验,只有犰狳。查看opencv 文档,我可以看到这image.data
是一个uchar
. 你不能只是 reinterpret_cast 值加倍。这是未定义的行为,在这种情况下绝对是错误的。
犰狳矩阵类 ( arma::Mat
) 是一个模板。您可以创建一个Mat<uchar>
并使用Mat<uchar>(ptr_aux_mem, n_rows, n_cols, copy_aux_mem = true, strict = false)
构造函数来避免元素的复制。当然,您也可以使用其他犰狳类型,但在这种情况下,您需要复制元素才能转换为其他类型(例如 to arma::mat
,它只是 to 的别名arma::Mat<double>
)。在这种情况下,您将使用不同的构造函数。
推荐阅读
- pytorch - 火炬培训;“运行时错误:PyTorch 和 torchvision 版本不兼容......”
- java - 声明的包“”与预期的包“(文件名)”不匹配
- opengl - OpenGL中的预乘alpha和多重采样
- html - 光标指针适用于 chrome 但不适用于 Firefox
- c++ - CLang 中的 C++20 概念支持
- c# - 对于我制作了 2 个数组 char[] 和 int[] 的项目,它们的大小相同,我希望控制台返回响应
- python - 如何获取任何一个月的最后一周的日期
- python - google colab pro 可以连接超过 24 小时吗?
- python - Python“找不到模块”或“没有父级的相对路径”或“没有命名的模块
" 不一致的错误 - android - Android - 当 android 释放在 onCreate 中创建的数据的内存时会发生什么