3

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

3 に答える 3

5

dctmatCV_16SC1符号付きshortの行列を意味する型があります。しかし、あなたは一貫性のないものにアクセスしようとします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 に答える