2

たとえば、4*5*6 の 3D マトリックスがあります。6つの2Dマトリックスに分割したいと思います。目的は、これらの 2D マトリックスに対してデータ操作を行い、結果を取得することです。row()、rowRange() を試しましたが、エラーが発生しました。現在、手がかりはありません。誰かがより良いアイデアを投げますか?ありがとう〜

4

1 に答える 1

5

最後のインデックスが最も速く変化することに注意してください。つまり、6*5*4 のマットがあり、それを 6 つの 5x4 マットに分割したいということかもしれません。ドキュメントによると、「3次元マトリックスは平面ごとに保存されます」。

ただし、3D Mat が次のように作成されたとします。

int dims[] = {4, 5, 6};
Mat m3(3, dims, CV_8UC1, data);

次のようなことを実行して、要求したことを実行できます (ただし、実際に望んでいることではない可能性があります)。

Mat m2(4, 30, CV_8UC1, m3.data);
Mat m2x6 = m2.reshape(6);
std::vector<cv::Mat> channels;
cv::split(m2x6, channels);

m3ただし、 5 行 x 6 列の 4 つの画像を取得するには:

Mat p0(5, 6, CV_8UC1, m3.data + m3.step[0] * 0);
Mat p1(5, 6, CV_8UC1, m3.data + m3.step[0] * 1);
Mat p2(5, 6, CV_8UC1, m3.data + m3.step[0] * 2);
Mat p3(5, 6, CV_8UC1, m3.data + m3.step[0] * 3);

OpenCV での 3D Mats のサポートは十分ではないため、可能であれば使用を避けてください。別の方法として、複数のチャネルを持つ 2D Mat を使用することもできます。そのほうが扱いやすい場合が多いです。

于 2013-10-07T02:28:45.487 に答える