我在n行和m列的std::vector<std::vector<double>>
结构中有某些值,我希望将其转换为等效的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 :(得分:5)
dctmat
的类型为CV_16SC1
,表示签名短片的矩阵。但是你试图用dctmat.at<double>(i, j)
访问它,这是不连贯的。将您的矩阵定义为CV_64FC1
或使用dctmat.at<short>(i, j)
进行访问(第一种解决方案更好,因为您的向量为double
)。
答案 1 :(得分: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;
}
答案 2 :(得分:-3)
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());