7

std::vectorネストされたstd::vectors をに変換する最もエレガントで効率的な方法は何cv::Matですか? ネストされた構造体は配列を保持しています。つまり、すべての内部std::vectors は同じサイズを持ち、行列の行を表します。あるデータから別のデータにコピーされてもかまいません。

単一のネストされていないstd::vectorものは非常に簡単であることを知っています。コンストラクターがあります。

std::vector <double> myvec;
cv::Mat mymat;

// fill myvec
bool copy = true;

myMat = cv::Mat(myvec, copy);

ネストされたベクトルはどうですか?

4

2 に答える 2

8

私のバリアント(OpenCV 2.4が必要):

int size = 5;
vector<vector<double> > w(size);
for(int i = 0; i < size; ++i)
{
    w[i].resize(size);
    for(int j = 0; j < size; ++j)
        w[i][j] = (i+1) * 10 + j;
}

Mat m(size, size, CV_64F);
for(int i = 0; i < w.size(); ++i)
    m.row(i) = Mat(w[i]).t();

cout << m << endl;

出力:

[10, 11, 12, 13, 14;
  20, 21, 22, 23, 24;
  30, 31, 32, 33, 34;
  40, 41, 42, 43, 44;
  50, 51, 52, 53, 54]

の説明m.row(i) = Mat(w[i]).t():

  • m.row(i)ROI を設定し、元のマトリックスを指します
  • Mat(w[i])データをコピーせずにベクトルをラップします
  • .t()「行列式」を作成します - データのコピーは実行されません
  • =は行列式を評価しますが、ベクトルは ( sizex 1) 連続行列にラップされているため、 を 1 回呼び出すだけで真の転置なしで評価されmemcpyます。
于 2012-06-05T18:25:30.447 に答える
4

これはそれを行う方法です:

std::vector<double> row1;
row1.push_back(1.0); row1.push_back(2.0); row1.push_back(3.0);

std::vector<double> row2;
row2.push_back(4.0); row2.push_back(5.0); row2.push_back(6.0);

std::vector<std::vector<double> > vector_of_rows;
vector_of_rows.push_back(row1);
vector_of_rows.push_back(row2);

// make sure the size of of row1 and row2 are the same, else you'll have serious problems!
cv::Mat my_mat(vector_of_rows.size(), row1.size(), CV_64F);

for (size_t i = 0; i < vector_of_rows.size(); i++)
{   
    for (size_t j = 0; j < row1.size(); j++)
    {   
        my_mat.at<double>(i,j) = vector_of_rows[i][j];
    }   
}   

std::cout << my_mat << std::endl;

出力:

[1, 2, 3;
  4, 5, 6]

Matメソッドのコンストラクターを使用して別のアプローチを試みましたpush_back()が、成功しませんでした。幸運を!

于 2012-06-05T14:01:08.857 に答える