2011-05-06 9 views
2

私はいつもC APIを使いましたが、単純なプロジェクトをC++ APIに変換しようとしていますが、C++で行列の要素をどのように割り当てるのか分からないようです。例えば、私は、次の配列を有する:私はCでMat *rotation_vector = new Mat(3,3, CV_64FC1);C++のopencvで行列の要素を割り当てる方法は?

が割り当てられ3x3のマットを有する

double rotation[] = { 0, 1, 0, 
        -1, 0, 0, 
         0, 0, 1 }; 

が、それは単にcvInitMatHeader(rotation_vector, 3, 3, CV_64FC1, rotation);あろう。これはC++でどのように行われますか?

+0

あなたが言うようにCコードが機能するなら(私はopencvについてzipを知っています)、C++コードはまったく同じように動作します。なぜ新しいものを使用しなければならないと思いますか? –

+0

実際にはありません。 cvInitMatHeaderは古いcvMat構造体でのみ機能します。新しいMatオブジェクトでは動作しません – glassofwater

+0

新しいものを使用しないでください - それともあなたにいくつかの新機能がありますか?私の指摘は、あなたの古いCコードはC++でコンパイルしなければならないということです。 –

答えて

6

cv :: Matオブジェクトのいくつかの変形を使用する必要があります。サイズが知られており、に固定されている小さい行列の場合

、あなたがCV ::のmATXのオブジェクトを使用することができます:動的にサイズ、アレイの場合

cv::Matx33d rotation( 0.0, 1.0, 0.0, 
         -1.0, 0.0, 0.0, 
         0.0, 0.0, 1.0); 

を、あなたがCVを使用する::マットオブジェクト

cv::Mat aBigMatrix(53, 71, cv::CV_64FC1, cv::Scalar::all(0.0)); 

これは幅53、高さ71の2次元マトリックスを作成し、各要素は64ビットの浮動小数点シングルチャンネル値(基本的にはdouble)であり、すべての要素は0に設定されます。

代わりに、CV :: Mat_テンプレートクラスを使用することができ、および利点は、(とりわけ)クリーナー初期化です:

cv::Mat_<double> anotherBigMatrix(53, 71, 0.0); 

これは上記と同等のマトリックスを作成します。

最後に、あなたは、通常のCでそれを行うような方法に類似初期化リストでテンプレート行列クラスを使用することができます。

あり、異なるクラスを使用することには多くのトレードオフがあるので、あなたは確認する必要がありますあなたは自分の既に割り当てられたデータのためのヘッダを作成したい場合は、右の1

1

を選ぶように、OpenCV documentationを読んでやること:

cv::Mat rotation_matrix(3, 3, CV_64FC1, rotation) 

これは(マットこのデータのヘッダになりますデータはコピーされませんed)。あなたは新しい行列にコピーしたい場合は、行うことができます:あなたは(ほとんどの場合)cv::Matnewを使用しない

cv::Mat new_matrix = rotation_matrix.clone(); 

、それは参照カウントデータ型である - と考えますスマートポインタ。 CvMat*cv::Matである必要があります(*がないことに注意してください)。

関連する問題