2011-12-22 18 views
4

私はcv :: Matオブジェクトと他のコードを宣言したいと思います。次元(nrowsとncols)を変更してください。私はOpenCVのドキュメントでは何の方法も見つけられませんでした。彼らは常にコンストラクタにディメンションを含めることを提案します。cv :: Mat画像の寸法を動的に変更するには?

答えて

3

create()メソッドを使用するのが簡単でクリーンな方法です。あなたが好きなだけの時間を呼び出すことができ、そして偶然には作成するために送られたときには、画像バッファを再割り当てしますと、現在の画像パラメータが一致しない:

Mat frame; 

for(int i=0;i<n;i++) 
{ 
    ... 
    // if width[i], height[i] or type[i] are != to those on the i-1 
    // or the frame is empty(first loop) 
    // it allocates new memory 
    frame.create(width[i], height[i], type[i]); 
    ... 
    // do some processing 
} 
+4

元のイメージを破壊していませんか?私はあなたがサイズ変更を使用しなければならないと思った –

+0

あなたは正しいですMat ::前のデータを参照解除するhttp://docs.opencv.org/modules/core/doc/basic_structures.html#mat-create Mat :: resize preserves STLベクタクラスと同じようにhttp://docs.opencv.org/modules/core/doc/basic_structures.html#mat-resize – gantzer89

+0

私は説明するのが面倒なので、resize()はSTLとして動作しませんこの場合、ジョブはcreate()します。新しいサイズが元のサイズと一致しない場合のみ再割り当てされます。 – Sam

6

イメージのサイズを変更する場合は、​​をチェックしてください。

は大きさで新しい Mat dstを作成したデータは、その後、あなたが欲しいタイプ:

cv::resize(src, dst, dst.size(), 0, 0, cv::INTER_CUBIC); 

は、ドキュメントをチェックし、cv::INTER_CUBIC以外の他の補間方法があります。

+0

おかげでカールを使用していますが、私の問題は、私がしたいということですcv :: Matオブジェクトの型と次元を動的に定義します。 resize()は1つの解決策かもしれませんが、正確には私が探しているものではありません。 – Rasoul

+0

さて、私は、その目的のために 'resize()'を使ったことがあります。 'src' Matのサイズを変更する必要があるときは、必要な次元とタイプの新しいMatを宣言し、' resize() 'を実行してデータを新しい次元に拡大するだけです。また、必要に応じて、元のMatに再寸法データをコピーするために 'src = dst.clone();'を実行することもできます。 – karlphillip

3

このように計算する変数Sizeを定義するだけですか?

// dynamically compute size... 
Size dynSize(0, 0); 
dynSize.width = magicWidth(); 
dynSize.height = magicHeight(); 

int dynType = CV_8UC1; 
// determine the type you want... 

Mat dynMat(dynSize, dynType); 
+0

ありがとう!私は解決策を見つけたと思う、cv :: mat imageを宣言する; create()をimage.create(magicWidth()、magicHeight()、dynType)として呼び出すことによって、そのプロパティを動的に変更します。 – Rasoul

+0

'' Mat'オブジェクトを宣言した直後に、 'create()'は必ずコンストラクタと同じことをする必要があります。 – mevatron