получить максимальную и минимальную глубину от Kinect

Мой 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();

person Nikolas Rieble    schedule 18.10.2013    source источник
comment
Я имею в виду, что должно возвращать минимум и максимум. Что будет в вашем списке, когда вы доберетесь до этой точки?   -  person Ryan Schlueter    schedule 18.10.2013


Ответы (2)


Если вам просто нужно минимальное/максимальное значение, а depthData представляет собой байтовый массив из 16-битных значений глубины, это будет проще и быстрее:

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, которая, кажется, объявлена ​​где-то еще, выглядит опасным. И список просто избыточен!

person Chris    schedule 18.10.2013
comment
Ладно, я понял. теперь я использовал код цикла, подобный этому -sharp" title="создание растрового изображения данных глубины, где цвет показывает расстояние c Sharp">stackoverflow.com/questions/19274287/, но все равно на выходе два числа, которые абсолютно одинаковы. - person Nikolas Rieble; 18.10.2013
comment
У вас все еще есть depthdata[depthIndex], а ваш расчетный индекс называется просто index. Опечатка? - person Chris; 18.10.2013
comment
в другом цикле (который я связал в комментарии) индекс используется только для окрашивания нового в определенный цвет. Так что в этом случае мне это даже не нужно. Теперь я запутался, почему я использую цикл без использования x и y внутри цикла. Тем не менее СЕЙЧАС я получаю результат для zMax, который кажется правильным и всегда равен 0 для zMin. - person Nikolas Rieble; 18.10.2013
comment
Да, у вас сейчас очень странная петля. Какого типа и размера depthdata? - person Chris; 18.10.2013
comment
Byte[] depthdata = imageFrame.Image.Bits; - person Nikolas Rieble; 18.10.2013
comment
Ширина * высота в байтах? х2, х4? - person Chris; 18.10.2013
comment
я не знаю. я должен добавить больше кода для понимания? (я могу понять, что это основной вопрос, тем не менее у меня нет знаний, чтобы ответить на него) - person Nikolas Rieble; 18.10.2013
comment
Да, все зависит от того, что на самом деле содержит depthData и что делает GetDistance. В документах говорится, что возможно несколько различных форматов, поэтому нам нужно посмотреть, как вы настраиваете kinect, чтобы узнать больше. - person Chris; 18.10.2013
comment
Спасибо. Моя ошибка заключалась в том, что я думал, что мне нужно пройти через растровое изображение, чтобы получить расстояние, вместо прямого доступа к байтовому массиву данных глубины. Мне еще многому предстоит научиться. :) - person Nikolas Rieble; 18.10.2013
comment
Дорогой Крис, я не знаю, как с тобой связаться иначе, но ты очень помог мне с этим вопросом, и у меня есть еще один вопрос, который ты мог бы тоже решить! : D, пожалуйста, взгляните на: stackoverflow.com/questions/19933755/ - person Nikolas Rieble; 13.11.2013

Чтобы вычислить zMax, вы можете искать наибольшее значение в массиве данных глубины, однако для вычисления zMin вам нужно искать наименьшее значение, которое больше, чем FLT_EPSILON (= 1,192092896e-07f). Код, который реализует именно то, что вам нужно, с помощью библиотеки J4K Java для 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];
    }

}
person Angelos B    schedule 28.10.2013
comment
Спасибо за ответ, тем не менее я обязан использовать С#, и из-за моего старого kinect мне также приходится использовать бета-версию SDK 2. Тем не менее, вы правы, мне нужно zMIN, который больше 0 (потому что 0 - это значение всех точек слишком далеко или слишком близко.) - person Nikolas Rieble; 28.10.2013
comment
Пожалуйста. Небольшой комментарий: тестирование для ›0 немного отличается от тестирования для ›FLT_EPSILON, которое используется во всех примерах Kinect SDK от Microsoft. - person Angelos B; 28.10.2013