2012-08-27 234 views
18

私のアプリケーションでは、いくつかの値を持つOpenCV Mat A(2次元)を作成し、Aを入力として使用して別のOpenCV関数に渡したいと考えています。OpenCV Matを2次元配列で初期化する

現在、私がしようとしている:

// 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); 

1次元配列の場合は、値渡しでOKです。しかし、2Dアレイではこれはうまくいかず、これはもっと一般的なケースです。 OpenCVでこれをどのように解決できますか?

答えて

23

はorginally、私はOpenCVのオンラインガイドからニーモニックを使用:

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

しかし、私は、ドキュメントが "size_tのステップ= AUTO_STEP" によって何を意味するのか理解できませんでした。お使いながら、2Dマット用

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

が配列

16

から初期化:そして、これは私がAUTO_STEP

を選択OpenCVのは、自動的に私が試したし、これが連動する「ステップ」引数をOMMITできることを意味します答えがあなたの状況に合っていれば、それは良いことを知っているでしょうstepAUTO_STEPの意味は

です。

通常、イメージは連続したメモリブロックに格納されています。各行は、前の1の後に、次ので、あなたがポインタでデータにアクセスすることができ、単純な幅が(ないピクセルで!)バイト単位で行幅

がある。しかし、これは常にではありません

data = dataPtr[currentCol + width * currentRow]; 

場合によっては部分行列にアクセスすることがあり、データは各行で連続しますが、次の行に行くにはジャンプバイトのシーケンス。

これは、ステップ(ストライドとも呼ばれます)が入る場所です。連続する2つの行の間隔(バイト単位)を表します。連続行列の場合、その値はsizeof(pixel)*rowWidthですが、特殊な状況ではカスタム値を持つことがあります。 AUTO_STEPをMatコンストラクタに渡すと、データが連続していることがわかり、上記の式でステップが計算されます。ここで、ピクセル値を読み取るためのより正確なアプローチは、すべての種類の画像で機能しています。

最後に、バイトではなく、ピクセルで測定されたステップを忘れないようにしてください。ですから、RGB画像UCHAR 3チャンネルを持っている場合、ステップは3*number of pixelsになり、あなたは3チャンネルint型のイメージを持っている場合、data以来step = 3(channels)*(4=sizeof(int))*(number rows)

5

は、2次元配列である - data&data*datadata[0]&data[0]のすべて、 &data[0][0]は配列の基点を指します。上記の表現のいずれかが正しく

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

Xの代わりにMatを構築するために選択することができるデータがvoid*としてOpenCVのでacceptedで、OpenCVのによるデータアクセスがlineのようですので、心の平和を持っています。私は、単一または多次元配列からMatを構築するのと同じ構文を好む。

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

戻るクエリに - なお、でも1次元配列からMatのあなたの建設が正しくありません。ステップパラメータは2と記載されています。行数が1の場合、OpenCV overridesのステップパラメータが提供されているので、うまくいきました。高次元配列の場合、OpenCVは正しくないステップパラメータのデバッグassertionをスローします。

14

上記の回答に加えて、another optionがあります。小さいデータについては

、私は次のことを好むだろう:

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

あなたは簡単に追加の変数「データ」を定義する必要がなく、所望の結果を得ることができます。

関連する問題