OpenCV вектор векторов в cv :: Mat

У меня есть определенные значения в std::vector<std::vector<double>>структура из n строк и m cols, которые я хотел бы преобразовать в эквивалентный объект 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];
}
}

2

Решение

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

5

Другие решения

Вот моя шаблонная версия процедур преобразования

подпрограммы

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

Вот в документации 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());
-3
По вопросам рекламы [email protected]