将CV::Mat转换为Arma::Mat
Convert CV::Mat To Arma::mat
我试图将Opencv中的形式矩阵转换为armadillo 中的矩阵
我在这个链接中发现了这个函数
但当我试图调用它时,会给我错误:
- 错误C2783:"arma::Mat cvMat2armaMat(cv::Mat&)":无法推导"T3"的模板参数
- IntelliSense:没有函数模板"cvMat2armaMat"的实例与参数列表匹配
这是功能:
template<class T3>
arma::Mat <T3> cvMat2armaMat(cv::Mat & cvMatIn)
{
return armaConv (cvMatIn.data, cvMatIn.rows, cvMatIn.cols,false);
}
这是函数调用(当我调用func时出现错误)
cv::Mat CurrentImage = imread(path, 0);
arma::mat singleImage = cvMat2armaMat (CurrentImage);
我该怎么办?
您需要指定cvMat2armaMat()
返回的arma::mat<XXX>
的类型
什么是armaConv
也许你的意思是:
template<class T3>
arma::Mat <T3> cvMat2armaMat(cv::Mat & cvMatIn)
{
return arma::Mat <T3> (cvMatIn.data, cvMatIn.rows, cvMatIn.cols,false);
}
呼叫是这样的:
auto singleImage = cvMat2armaMat<float>(CurrentImage);
或者您需要在cv::Mat
类型上使用switch
。
我可以回答如何在VC10和g++上做到这一点,但我仍有一些问题需要解决。我是编写模板函数的新手。由于Armadillo具有更完整的线性代数设施,因此经常需要在cv::Mat
和arma::mat
矩阵对象之间进行转换。OpenCV将矩阵按行主序存储,而Armadillo将矩阵按列主序存储——这是该问题的一个组成部分。我已经创建了以下模板函数,这些函数已经在VC10和g++4.9中进行了测试,可以在float
和double
类型矩阵上工作:
template<typename T>
static void Cv_mat_to_arma_mat(const cv::Mat_<T>& cv_mat_in, arma::Mat<T>& arma_mat_out)
{
cv::Mat_<T> temp(cv_mat_in.t()); //todo any way to not create a temporary?
#if defined(WIN32)
//This compiles on VC10 but not g++ 4.9 (on Debian with OpenCV 2.4.9.1 and Arma 4.320.0)
arma_mat_out = arma::Mat<T>(temp.ptr<T>(), //<<"error: expected primary-expression before '(' token"
static_cast<arma::uword>(temp.cols),
static_cast<arma::uword>(temp.rows),
true,
true);
#elif defined(LINUX)
//This compiles on both but is not as nice
arma_mat_out = arma::Mat<T>(reinterpret_cast<T*>(temp.data),
static_cast<arma::uword>(temp.cols),
static_cast<arma::uword>(temp.rows),
true,
true);
#endif
};
//This one is fine on both
template<typename T>
static void Arma_mat_to_cv_mat(const arma::Mat<T>& arma_mat_in,cv::Mat_<T>& cv_mat_out)
{
cv::transpose(cv::Mat_<T>(static_cast<int>(arma_mat_in.n_cols),
static_cast<int>(arma_mat_in.n_rows),
const_cast<T*>(arma_mat_in.memptr())),
cv_mat_out);
};
此代码可以与一起运行
std::cout << "Testing arma::mat<->cv::Mat <double>:" << std::endl;
{
arma::Mat<double> A(3,2);
A << 1 << 2 << arma::endr
<< 3 << 4 << arma::endr
<< 5 << 6 << arma::endr;
cv::Mat_<double> cv_A(3,2);
M_math::Arma_mat_to_cv_mat<double>(A, cv_A);
std::cout << "Arma_mat_to_cv_mat<double>" << std::endl;
std::cout << A << std::endl;
std::cout << cv_A << std::endl;
std::cout << "Cv_mat_to_arma_mat<double>" << std::endl;
M_math::Cv_mat_to_arma_mat<double>(cv_A, A);
std::cout << cv_A << std::endl;
std::cout << A << std::endl;
}
std::cout << "Now <float>" << std::endl;
{
arma::Mat<float> A(3,2);
A << 1 << 2 << arma::endr
<< 3 << 4 << arma::endr
<< 5 << 6 << arma::endr;
cv::Mat_<float> cv_A(3,2);
M_math::Arma_mat_to_cv_mat<float>(A, cv_A);
std::cout << "Arma_mat_to_cv_mat<float>" << std::endl;
std::cout << A << std::endl;
std::cout << cv_A << std::endl;
std::cout << "Cv_mat_to_arma_mat<float>" << std::endl;
M_math::Cv_mat_to_arma_mat<float>(cv_A, A);
std::cout << cv_A << std::endl;
std::cout << A << std::endl;
}
我的进一步问题是:
知道我做错了什么吗?这似乎是VC10比g++更宽容的情况,但如果我想继续使用g++的第一个(更好的)版本,我会错过什么?
在
Cv_mat_to_arma_mat(...)
中,是否有任何建议可以绕过行主订单与行订单问题而不创建临时订单?cv_mat_in.t()
不会改变cv_mat_in
中的内部内存指针,它只是一个cv::MatExpr
。任何对这些功能的风格、安全性或性能的批评都将不胜感激。当然,它们不会与具有多个通道的
cv::Mat
一起工作。
相关文章:
- Difference in displaying cv2 Mat
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 将CHW格式的浮点向量转换为cv::Mat
- C++中的openCV Mat访问冲突
- OpenCV 和从 OutputArrays 或 (Mat) 读取数据
- 使用 mat.at<uchar>(i,j) 的 opencv C++中的矩阵赋值错误
- C++:从GPU内存(cudaMemcpy2D)获取BGR图像(cv::Mat)
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 将 cv::mat 转换为 QImage
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- Python/C++:可以导入犰狳(arma::)但不能导入子程序arma::arma_rng::randn
- 将 cv::Mat 转换为 std::vector 的通用函数
- 如何通过引用传递OpenCV MAT
- 在 QML VideoOutput 中将 cv::mat 显示为 QVideoFrame
- Read OpenCV Mat 16bit to QImage 8bit Greyscale
- 将本地 OpenCV Mat 变量声明为静态以防止重新分配
- 将 Eigen::MatrixXd 转换为 arma::mat 并在新对象上制作副本
- 使用 'std::generate' 或 'std::fill' 来填充 'arma::mat'
- 从C数组(column-major)转换为armadillo矩阵(arma::mat),无需复制
- 将CV::Mat转换为Arma::Mat