0

私の Kinect は、地面に直接下向きに天井に取り付けられます (地面に平行である必要があります)。オブジェクト認識のために、地面までの距離(maxDistance)とオブジェクトまでの距離(minDistance)を取得したいと考えています。各ピクセルのすべての距離値をリストに追加するループを作成し、そのリストの最大値と最小値を取得しようとしました。

残念ながら、zMIN と zMAX の結果 (チェックするためにテキストボックスに書き込んでいます) は常に同じです。これは明らかに間違っています。

質問: 私は何を間違っていますか? :)

List<int> tiefe = new List<int>();

        for (var y = 0; y < height; y++)  
        {  

            for (var x = 0; x < width; x++)
            { 

                var distance = GetDistance(depthdata[depthIndex], depthdata[depthIndex + 1]);
                tiefe.Add(distance); 
                depthIndex += 2;
            }
        }
        var zMAX = tiefe.Max();
        var zMin = tiefe.Min();
4

2 に答える 2

2

最小値/最大値のみが必要で、depthData16 ビット深度値のバイト配列である場合、これはより簡単で高速になります。

int min = int.MaxValue, max = int.MinValue;
for( int i = 0; i < depthData.Length; i += 2 )
{
    int dist = GetDistance( depthData[i], depthData[i + 1] );
    if( dist < min ) min = dist;
    if( dist > max ) max = dist;
}

depthIndex他の場所で宣言されているように見えるその変数を使用すると危険に見えます。そして、リストは冗長です!

于 2013-10-18T15:34:01.100 に答える
0

zMax を計算するには、深度データ配列の最大値を検索できますが、zMin を計算するには、FLT_EPSILON (=1.192092896e-07f) よりも大きい最小値を検索する必要があります。J4K Java for Kinect ライブラリを使用して必要なものを正確に実装するコードは次のとおりです。

public void onDepthFrameEvent(short[] packed_depth, int[] U, int V[]) {
    DepthMap map=new DepthMap(depthWidth(),depthHeight(),packed_depth);
    float zMIN=4;//The largest possible value
    float zMAX=0;//The smallest possible value
    for(int i=0;i<map.realZ.length;i++)
    {
        if(zMAX<map.realZ[i]) zMAX=map.realZ[i];
        if(map.realZ[i]>DepthMap.FLT_EPSILON && zMIN>map.realZ[i]) zMIN=map.realZ[i];
    }

}
于 2013-10-28T04:30:20.500 に答える