8

この 投稿とOpenCVのドキュメントによると、多次元マットの各要素を初期化してアクセスできます。

実際、私は最初にMATLABでコーディングし、次にOpenCVに変換する必要があります。MATLABマトリックスは、a(:、:、3)またはb(:、:、3:5)のようなサブマトリックスアクセスをサポートします。

これはOpenCVで実行できますか?私の知る限り、これは2Dマットで行うことができます。その2Dはどうですか?

Edit01:さらに、多次元マットでは、プロパティの列と行は、マトリックスの3つのサイズを特徴付けるのに十分ではありません。ディメンションが3より大きい場合があります。これらのプロパティを保存するにはどうすればよいですか。

Edit02:

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

私はOpenCVMatでのサブマトリックスアクセスのアイデアをあきらめました。おそらく、OpenCVではサポートされていません。ただし、このサンプルコードから、コンストラクターは「sz」から3番目の次元を受け取ります。この3次元が渡されるマットのプロパティはどれですか?おそらくこの場合、rows = 100、cols = 100、その他?? =100OPenCVのドキュメントで迷子になりました

Edit03:OpenCVソースからのMatクラスの追跡mat.hppからEdit02でコンストラクターの定義を見つけました:

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でこのマット定義をトレースすると、マットマトリックスで自分の機能を変更/カスタマイズするのに役立つ可能性があります

PS:私の投稿があまりにも乱雑に書かれている場合はすみません!! 私は初心者のプログラマーで、プログラミングの問題を解決しようとしています。私のアプローチが良くないか、十分に正しくない場合、Plzは私を自由に訂正してください。ありがとうございました!!

4

2 に答える 2

7

関数rowRange、colRange、さらには関数を使用して、2D cv::Mat のサブマトリックスに簡単にアクセスできます

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

また、マトリックス コンストラクターで定義できるマトリックス内のチャネル数は、3 番目の次元として使用できます (ただし、256 または 512 に制限されていると思います)。

目的に合わせて適応できるテンプレート化された cv::Mat_ クラスもあります

[編集]

2 次元を超える行列のコンストラクタを確認しました。実行すると、Mat の行と列のフィールドが -1 に設定されます。実際の行列サイズは、int の配列として Mat::size に格納されます。次元が 2 を超える行列の場合、cv::Rect または rowRange/colRange を使用してサブ行列コンストラクタを使用することはできません。

行データを直接操作して、dim>2 の部分行列を抽出するために少し作業を行う必要があります。ただし、配列のレイアウトを示す Mat::step に格納されている情報を使用できます。これは公式ドキュメントで説明されています。

于 2012-09-11T13:18:10.463 に答える