3

cv::Matopencv関数を使用してpush_back新しい行をマトリックスに追加したいのですが、マトリックスのサイズを事前にキャッシュして、データを常に再割り当てする必要がないようにしたいと考えています。関数には行数パラメーターがありますが、これcv::mat::reserveは、列数 (およびデータ サイズを最初に) を指定する必要があることを意味します。したがって、以下のコードでは、最初に不要な空の行が1つ表示されると思います。reserveとを使用してこれを行う適切な方法はありますpush_backか??

cv::Mat M(1, size_cols, CV_32FC1);
M.reserve(size_rows);
for (int i = 0; i < size_rows; i++)
{
  GetInputMatrix(A);
  M.push_back(A.row(i));
}

注: コード例には表示されていませんが、最終的な行列の正確なサイズはわかりませんが、予約する最大値サイズを取得できます。

4

2 に答える 2

2

最初は空のマットを使用しても問題ありません。列の番号とタイプは、最初の によって決定されますpush_back

cv::Mat M;  // empty mat in the beginning
M.reserve(size_rows);
for (int i = 0; i < size_rows; i++) {
    GetInputMatrix(A);
    M.push_back(A.row(i));
}
于 2016-05-13T03:25:39.547 に答える
0

ドキュメントによると、

リザーブは:

このメソッドは、sz 行のスペースを予約します。行列に sz 行を格納するのに十分なスペースが既にある場合は、何も起こりません。行列が再割り当てされると、最初の Mat::rows 行が保持されます。このメソッドは、STL ベクトル クラスの対応するメソッドをエミュレートします。

そうは言っても、それほど大量のデータを保存しない限り、何も起こりません。

于 2016-05-12T15:02:25.157 に答える