3

kinect を使用しているときに、ビットマップとその深度情報が信頼できず、何らかの理由で実際のバイト配列のデータよりもはるかに乱れていることがわかりました。

このようにビットマップにアクセスして最小値と最大値を取得しようとしたときにこれに気付きました

for (var y = 0; y < height; y++)
{
  var heightOffset = y * width;
  for (var x = 0; x < width; x++)
  {
    var index = ((width - x - 1) + heightOffset) * 4;
    var distance = GetDistance(depth[depthIndex], depth[depthIndex + 1]);

しかし、一方で、この方法で深さバイト配列に直接アクセスすると、はるかに優れた結果が得られました (Stackoverflow メンバーのクリスが指摘したように、ありがとう、クリス)。

int min2 = int.MaxValue, max2 = int.MinValue;
for (int i = 0; i < depth.Length; i += 2)
{
  int dist = GetDistance(depth[i], depth[i + 1]);
  if (dist < min2 && dist > 0) 
    min2 = dist;

  if (dist > max2) 
    max2 = dist;
}

私の質問は:

  • 特定の距離間隔内のすべてのポイントをカウントしたい。
  • 次に、実際の位置(x、y)を取得したいと思います。

位置を取得したり、それらのポイントをリストに直接追加したりするにはどうすればよいですか?

私の最終的な目標は、特定の間隔内のピクセル数を数えることによって、特定の事前定義されたオブジェクトを識別することです (たとえば、ボールとブロックを区別するため)。

for (int i = 0; i < depth.Length; i += 2)
{
  int dist = GetDistance(depth[i], depth[i + 1]);

  if (dist < z2 && dist > z1) 
    a++;
}
4

1 に答える 1

1

行ごとdepthにバイトを含むバイト配列であると仮定すると、次のようなものを試してください。2 * widthheight

var points = new List<Point>();
for( int y = 0; y < height; y++ )
    for( int x = 0; x < width; x++ )
    {
        int i = y * width * 2 + x * 2;
        int dist = GetDistance( depth[i], depth[i + 1] );

        if( dist < z2 && dist > z1 )
            points.Add( new Point( x, y ) );
    }

Pointint x/y ペアを表すには、明らかに何らかの型に置き換える必要があります。

for (int i = 0; i < depth.Length; i += 2)前と同じように簡単に実行して、から x/y 値を計算することもできますi。(ヒント: モジュラス演算子は x の値を与え、単純な整数除算は多かれ少なかれ y を得るでしょう)

于 2013-11-13T21:50:45.283 に答える