2013-02-28 102 views
2

我有一些std::vector<std::vector<double>>结构的n行和m列我想转换成等效的cv :: Mat对象的某些值。这是我一直在使用的代码,但我得到了一个错误:OpenCV向量载入到cv :: Mat

DCTM是被定义为本地参数: std::vector<std::vector<double>>

cv::Mat dctmat = cvCreateMat(dctm.size(), dctm[0].size(), CV_16SC1); 
for (size_t i = 0; i < dctm.size(); i++) { 
    for (size_t j = 0; j < dctm[i].size(); j++) { 
     dctmat.at<double>(i, j) = dctm[i][j]; 
    } 
} 
+0

你得到的错误是什么? – cedrou 2013-02-28 16:21:15

回答

5

dctmat有型CV_16SC1这意味着签订短期矩阵。但是,您尝试使用不连贯的dctmat.at<double>(i, j)来访问它。要么将您的矩阵定义为CV_64FC1,要么通过dctmat.at<short>(i, j)访问它(首先解决方案更好,因为您的矢量为double)。

+0

非常感谢! – ChrisGeo 2013-02-28 16:42:54

-3

OpenCV的文档中Here你可以发现这一点:

Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP) 
Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP) 
... 

然后,你可以使用这样的:

Mat dctmat(dctm.size(), dctm[0].size(), CV_16SC1, dctm.data()); 
+0

你试过了吗?那'dctm.data()'不适用于我*作为向量的矢量* – zhangxaochen 2014-11-29 16:33:37

2

这里是我的转换模板版本例程

程序

template<typename _Tp> static cv::Mat toMat(const vector<vector<_Tp> > vecIn) { 
    cv::Mat_<_Tp> matOut(vecIn.size(), vecIn.at(0).size()); 
    for (int i = 0; i < matOut.rows; ++i) { 
     for (int j = 0; j < matOut.cols; ++j) { 
      matOut(i, j) = vecIn.at(i).at(j); 
     } 
    } 
    return matOut; 
} 
template<typename _Tp> static vector<vector<_Tp> > toVec(const cv::Mat_<_Tp> matIn) { 
    vector<vector<_Tp> > vecOut(matIn.rows); 
    for (int i = 0; i < matIn.rows; ++i) { 
     vecOut[i].resize(matIn.cols); 
     for (int j = 0; j < matIn.cols; ++j) { 
      vecOut[i][j] = matIn.at<_Tp>(i, j); 
     } 
    } 
    return vecOut; 
} 
相关问题