2012-09-11 34 views
7

によると、 postとOpenCVのドキュメントから多次元マットの各要素を初期化してアクセスすることができます。OpenCVの多次元Matのアクセスサブマトリクス

実際には、まずMATLABでコード化し、今はOpenCVに変換する必要があります。 MATLAB行列は、a(:、:、3)またはb(:、:、3:5)のような部分行列アクセスをサポートします。

これはOpenCVで実行できますか?私が知る限り、これは2D Matで行うことができます。 2Dについてはどうですか?

Edit01: さらに、多次元Matでは、colsとrowsのプロパティでは3つのサイズの行列を特徴づけることができません。 3より大きい次元のケースがあります。これらのプロパティを保存する方法は?

Edit02:

// create a 100x100x100 8-bit array 
int sz[] = {100, 100, 100}; 
Mat bigCube(3, sz, CV_8U, Scalar::all(0)); 

私はOpenCVのマットとサブマトリックスアクセスのアイデアをあきらめます。おそらく、OpenCVではサポートされていない可能性があります。しかしこのサンプルコードから、コンストラクタは 'sz'から3次元を受け取ります。この3次元のマットのどの特性が渡されますか?おそらくこの場合、rows = 100、cols = 100、other ?? = 100 私はOpenCVのドキュメント

Edit03で迷ってしまいました:私はmat.hppからEdit02でのコンストラクタの定義を見つけたOpenCVのソース から追跡マットクラス:

inline Mat::Mat(int _dims, const int* _sz, int _type, const Scalar& _s) 
    : flags(0), dims(0), rows(0), cols(0), data(0), refcount(0), 
    datastart(0), dataend(0), datalimit(0), allocator(0), size(&rows) 
{ 
    create(_dims, _sz, _type); 
    *this = _s; 
} 

次の質問ですここでどのように「作成」機能が定義されていますか? => OpenCVでこのMatの定義をトレースすることは、おそらくMat Matrixで自分の機能を変更/カスタマイズするのに役立ちます。

PS:私の投稿があまりにも面倒です!私はプログラマーであり、プログラミングの問題を解決しようとしています。私のアプローチがうまくいかない場合、Plzは私を修正することができます。ありがとうございました!!

+0

多次元Matのコンストラクタを含むコンストラクタのすべての宣言を見るにはcore.hppを使用しました。しかし、3次元がどのようなプロパティになるかを見るために、そのコンストラクタのコーディングを意味する定義がどこにあるのかわかりませんでした。そのソースコードはどこですか? –

+0

それはそこにあります: /modules/core/src/matrix.cpp。以下の元の問題に関する私の答えを編集しています – remi

+0

このコードを書くことになりましたか?私は同じことをやろうとしています... – kmac

答えて

6

あなたは2D品種のサブ行列に簡単にアクセスすることができます::マットを、また、マトリックス内のチャネル数を機能rowRange、colRangeあるいは

cv::Mat subMat = originalMat(cv::Rect(x,y,width,height)); 

を使用して、あなたは行列コンストラクタで定義することができ、 3次元として使うことができます(しかし、それは256または512に制限されています)。

テンプレート品種もあります::あなたがあなたの目的

に合わせて適応することができMat_クラス[編集]

はI>が2次元の行列のコンストラクタをチェックしました。実行すると、Matのrowsとcolsフィールドは-1に設定されます。実際の行列サイズは、intの配列としてMat :: sizeに格納されます。 ディメンションが2より大きい行列の場合、cv :: RectまたはrowRange/colRangeを使用してサブマトリックスコンストラクタを使用することはできません。

dim> 2の部分行列を抽出するために、行データを直接扱うために少しの労力をかけなければならないのではないかと恐れています。しかしMat :: stepに格納されている情報を使って配列のレイアウトを知ることができます。これはofficial documentationで説明されています。

+0

..あなたは、この種の行列アクセスを行うために別々の関数を書くべきですか?例えば、myMatを書くことによってMatクラスに追加することができますか?これは愚かな質問ですが、アマチュアのプログラマーとして、私は本当にプロフェッショナルのやり方で物事がどのように行われているのか知りたがっています –

+0

プロフェッショナルだけが仕事をやろうとしています:)あなたの場合は、 N次元データ。私は新しいクラスを書くのは気にしません。 – remi

+0

私は自分のクラスや関数を書いてそれを達成したいと思っているので、私はこの記事を閉じたくはありません。だから私はそれのために私の言い訳:) –