3

我在 n 行和 m cols 的结构中有某些值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];
    }
}
4

3 回答 3

5

dctmat有一种类型CV_16SC1,表示有符号短矩阵。但是您尝试访问它dctmat.at<double>(i, j)是不连贯的。将您的矩阵定义为CV_64FC1或访问它dctmat.at<short>(i, j)(第一个解决方案更好,因为您有一个向量double)。

于 2013-02-28T16:24:31.260 回答
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;
}
于 2015-03-12T22:53:19.923 回答
-3

在 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());
于 2013-08-28T23:12:43.183 回答