1

2d STL ベクトルから OpenCV Mat に変換するためのいくつかの行を含む関数を作成しています。OpenCV は、Mat(vector) を使用したベクトルからの Mat の初期化をサポートしているためです。しかし、今回は 2D ベクトルを試してみましたが、うまくいきませんでした。

関数は次のように単純です。

template <class NumType>
Mat Vect2Mat(vector<vector<NumType>> vect)
{
    Mat mtx = Mat(vect.size(), vect[0].size(), CV_64F, 0);  // don't need to init??
    //Mat mtx;

    // copy data
    for (int i=0; i<vect.size(); i++)
        for (int j=0; j<vect[i].size(); j++)
        {
            mtx.at<NumType>(i,j) = vect[i][j];
            //cout << vect[i][j] << " ";
        }   

    return mtx;
}

したがって、NumType に応じて Mat mtx を初期化する方法はありますか?? 構文は常にCV_32F、CV_64F、....で固定されているため、非常に制限されています

ありがとうございました!

4

1 に答える 1

1

OpenCVのドキュメントから与えられた答えを見つけたと思います。DataTypeクラスを利用した手法を「Class Trait」と呼んでいます。

それは次のようなものです:

Mat mtx = Mat::zeros(vect.size(), vect[0].size(), DataType<NumType>::type);

例えば:

  template <class NumType>
cv::Mat Vect2Mat(std::vector<std::vector<NumType>> vect)
{
    cv::Mat mtx = cv::Mat::zeros(vect.size(), vect[0].size(), cv::DataType<NumType>::type);  
    //Mat mtx;

    // copy data
    for (int i=0; i<vect.size(); i++)
        for (int j=0; j<vect[i].size(); j++)
        {
            mtx.at<NumType>(i,j) = vect[i][j];
            //cout << vect[i][j] << " ";
        }   

        return mtx;
}
于 2013-01-12T09:59:04.123 に答える