質問: 3次元配列を指定した範囲で平均化 ステレオカメラを用いて深度測定をする際に、サンプルを参考に3dのポイントクラウドを生成するまでの流れは理解しました。 しかし、得られた三次元配列はデータ量が多いことや精度の問題から例えばx-y座標において3×3の9ブロックに分けたときに、ブロックごとのz軸の平均値を 取得する方法を教えていただきたい次第です。
回答: brockproc 関数とmean関数を組み合わせる方法があります。 3x3(9要素)のブロックごとにx,y,zのそれぞれの平均値を求めます。ステレオ画像で値がなかった画素は数値がnanになっていると思いますので、平均値を求めるときにnanは除外します。 ステレオ画像データは下記のサンプルを利用し、points3dが求まっていることを前提します。 https://www.mathworks.com/help/vision/ug/depth-estimation-from-stereo-video.html % 1つのブロックサイズ blocksize = [3, 3]; % x, y, zの値を平均 % 1つ1つのブロックごとに平均値を求める関数を定義します fun = @(block_struct) mean(block_struct.data, [1, 2], 'omitnan'); % ブロックごとに平均値を求めた値を出力します points3d_mean = blockproc(points3d, blocksize, fun); % rgbの値を平均 % 1つ1つのブロックごとに平均値を求める関数を定義します fun = @(block_struct) uint8( round(mean(block_struct.data, [1, 2], 'omitnan')) ); % ブロックごとに平均値を求めた値を出力します frameleftrect_mean = blockproc(frameleftrect, blocksize, fun); ptcloud_mean = pointcloud(points3d_mean, 'color', frameleftrect_mean); % 描画します player3d_mean = pcplayer([-3, 3], [-3, 3], [0, 8], 'verticalaxis', 'y', ... 'verticalaxisdir', 'down'); view(player3d_mean, ptcloud_mean);