34

私のアプリケーションでは、いくつかの値を持つOpenCVマットA(2次元)を作成し、それを入力としてAを使用して別のOpenCV関数に渡します。

現在、私は試しています:

// float data[2][5] = {{1,2,3,4,5},{7,8,9,10,11}}; 
// OR
float data[10] = {1,2,3,4,5,7,8,9,10,11};

// and then
//  A = Mat(1, 5, CV_32FC1, &data, 2);   // init from float 1D - array
// OR 
    A = Mat(2, 5, CV_32FC1, &data, 2);  

1D配列の場合、値の受け渡しはOKです。ただし、これは2Dアレイでは機能しません。これは、さらに一般的なケースです。OpenCVでこれを解決するにはどうすればよいですか?

4

5 に答える 5

35

もともと、私はOpenCVオンラインガイドのニーモニックを使用しました。

Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)

しかし、私はその文書が何を意味するのか理解していませんでしたsize_t step=AUTO_STEPstepこれは、 OpenCVが自動的に選択する引数を省略できることを意味しますAUTO_STEP

私が試しましたが、これは機能します:

A = Mat(2, 5, CV_32FC1, &data);

アレイから初期化された2Dマットの場合

于 2012-08-27T09:41:03.953 に答える
27

あなたの答えはあなたの状況に対して正しいですが、何stepAUTO_STEP意味するのかを知ることは良いことです

通常、画像はメモリの連続ブロックに保存されます。各行は前の行の後に続くので、簡単なポインターでデータにアクセスできます

data = dataPtr[currentCol + width * currentRow];

ここで、widthはバイト単位の行幅です(ピクセル単位ではありません!)

ただし、これが常に当てはまるわけではありません。サブマトリックスにアクセスし、データが各行で連続している場合もありますが、次の行に移動するには、一連のバイトをジャンプする必要があります。

これがステップ(ストライドとも呼ばれます)の出番です。これは、2つの連続する行間の距離をバイト単位で表します。連続行列では、その値はですがsizeof(pixel)*rowWidth、特別な状況ではカスタム値を持つ場合があります。AUTO_STEPをMatコンストラクターに渡すと、データが連続していることがわかり、上記の式を使用してステップを計算します。だから今、ピクセル値を読み取るためのより正しいアプローチは

data = dataPtr[currentCol + step * currentRow];

これはあらゆる種類の画像で機能します。

最後になりましたが、ステップはピクセルではなくバイトで測定されることを忘れないでください。したがって、3チャンネルのuchar RGB画像がある場合、ステップはになります。3チャンネルのint画像がある場合は、3*number of pixelsstep = 3(channels)*(4=sizeof(int))*(number rows)

于 2012-08-27T10:01:20.117 に答える
23

上記の回答に加えて、別のオプションがあります。

小さいデータの場合は、次のようにします。

Mat A = (Mat_<float>(2, 5) << 1, 2, 3, 4, 5, 7, 8, 9, 10, 11);

追加の変数'data'を定義しなくても、目的の結果を簡単に取得できます。

于 2015-06-24T10:25:45.853 に答える
11

dataは2D配列であるため、、、、、、、のすべてが配列のベースをdata指します。上記の表現のいずれかを選択して、inの代わりにを正しく構築することができます。&data*datadata[0]&data[0]&data[0][0]MatX

A = Mat(2, 5, CV_32FC1, X );

データはOpenCVによって受け入れられ、OpenCVvoid*によるデータアクセスは同じように行われるため、安心してください。一次元または多次元の配列からMatを構築する場合も同じ構文が好きです。

A = Mat(1, 10, CV_32FC1, data ); //for 1D array
A = Mat(2, 5, CV_32FC1, data ); //for 2D array

クエリに戻るMat-1D配列からでも構築が正しくないことに注意してください。ステップパラメーターは2と記載されています。行数が1の場合、OpenCVは提供されたステップパラメーターをオーバーライドするため、たまたま機能しました。高次元配列の場合、OpenCVは、取得した誤ったステップパラメーターに対してデバッグアサーションをスローします。

于 2014-05-18T13:57:33.417 に答える
1

このマージされたプルリクエストからのC++11ソリューション:

// Mat(sizes, list)
cv::Mat A({2, 5}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
于 2021-09-08T17:21:56.247 に答える