2013-02-28 5 views
2

У меня есть определенные значения в структуре n строк и m cols, которые я хотел бы преобразовать в эквивалентный объект cv :: Mat. Это код, который я использую, но я получаю сообщение об ошибке:Вектор вектора векторов в 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

ответ

5

dctmat имеет тип CV_16SC1 что означает матрицу подписан короткий , Но вы пытаетесь получить к нему доступ с dctmat.at<double>(i, j), который некогерентен. Либо определите свою матрицу как CV_64FC1, либо получите доступ к ней с помощью dctmat.at<short>(i, j) (первое решение лучше, потому что у вас есть вектор double).

+0

Удивительная благодарность! – ChrisGeo

-3

Here в документации OpenCV вы можете нашел это:

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

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; 
}