首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将简历::mat改为Arma::mat

将简历::mat改为Arma::mat
EN

Stack Overflow用户
提问于 2014-09-30 10:47:42
回答 2查看 2.7K关注 0票数 3

我尝试将Opencv中的矩阵转换为armadillo中的矩阵。

我在this link找到了这个玩偶

但当我试图称它为错误时:

  1. 错误C2783:'arma::Mat cvMat2armaMat(cv::Mat &)‘:无法推断“T3”的模板参数
  2. IntelliSense:函数模板"cvMat2armaMat“的实例与参数列表不匹配

这就是职能:

代码语言:javascript
复制
template<class T3>
 arma::Mat <T3> cvMat2armaMat(cv::Mat & cvMatIn) 
{ 
    return armaConv (cvMatIn.data, cvMatIn.rows, cvMatIn.cols,false); 

}

这是函数调用(调用func时出现错误)

代码语言:javascript
复制
cv::Mat CurrentImage    = imread(path, 0);

arma::mat singleImage = cvMat2armaMat (CurrentImage);

我该怎么办?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-30 11:04:08

您需要指定cvMat2armaMat()返回的cvMat2armaMat()类型。

什么是armaConv

也许你是说这个

代码语言:javascript
复制
template<class T3>
arma::Mat <T3> cvMat2armaMat(cv::Mat & cvMatIn) 
{ 
    return arma::Mat <T3> (cvMatIn.data, cvMatIn.rows, cvMatIn.cols,false); 
}

电话是这样的:

代码语言:javascript
复制
auto singleImage = cvMat2armaMat<float>(CurrentImage);

或者您需要在switch类型上使用cv::Mat

票数 2
EN

Stack Overflow用户

发布于 2014-10-23 01:15:46

我可以回答如何在VC10和g++上这样做,但我仍然有一些问题要解决。我刚开始写模板函数。由于Armadillo有更完备的线性代数工具,所以经常需要在cv::Matarma::mat矩阵对象之间进行转换。OpenCV按行大顺序存储它的矩阵,而Armadillo按列大顺序存储它的矩阵,这是这个问题的一个组成部分。我创建了以下模板化函数,并在VC10和g++ 4.9中进行了测试,以便在floatdouble类型矩阵上工作:

代码语言:javascript
复制
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);
};

此代码可以在以下情况下运行:

代码语言:javascript
复制
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;
}

我的进一步问题是:

  1. 知道我做错了什么吗?这似乎是一个VC10比g++更宽容的情况,但是如果我想继续在g++中使用第一个(更好)版本,那么我缺少什么呢?
  2. Cv_mat_to_arma_mat(...)中,是否有任何建议可以在不创建临时命令的情况下解决行的主要顺序和行顺序问题?cv_mat_in.t()不改变cv_mat_in中的内部内存指针,它只是一个cv::MatExpr
  3. 任何对这些功能的风格、安全性或性能的批评都将不胜感激。当然,他们不会与拥有多个频道的cv::Mat合作。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26118862

复制
相关文章

相似问题

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