Сдвиг битов и преобразование байтов в int в F # - PullRequest
0 голосов
/ 05 октября 2011

Я использую kinect, чтобы сделать несколько вещей в F #, но у меня возникли небольшие проблемы при работе с данными глубины.Я следовал этому уроку: http://digitalerr0r.wordpress.com/2011/06/21/kinect-fundamentals-3-getting-data-from-the-depth-sensor/

с примерами c #, которые я пытался преобразовать в F #.

Эта часть кода проблематична:

void kinectSensor_DepthFrameReady(object sender, ImageFrameReadyEventArgs e)
{
PlanarImage p = e.ImageFrame.Image;

    Color[] DepthColor = new Color[p.Height * p.Width];

    float maxDist = 4000;
    float minDist = 850;
    float distOffset = maxDist – minDist;

    kinectDepthVideo = new Texture2D(GraphicsDevice, p.Width, p.Height);

    int index = 0;
    for (int y = 0; y < p.Height; y++)
    {
        for (int x = 0; x < p.Width; x++, index += 2)
        {
            int n = (y * p.Width + x) * 2;
            int distance = (p.Bits[n + 0]  |  p.Bits[n + 1] << 8);
            byte intensity = (byte)(255 – (255 * Math.Max(distance – minDist, 0) / (distOffset)));
            DepthColor[y * p.Width + x] = new Color(intensity, intensity, intensity);

        }
    }
}

Проблема, с которой я сталкиваюсь, выглядит следующим образом: int distance = (p.Bits[n + 0] | p.Bits[n + 1] << 8);

в F # его должно стать let distance = (p.Bits.[n+0] ||| p.Bits.[n+1] <<< 8)

это означает, что через определение типа это расстояние имеет тип "байт ", который я затем приведу к int, как это: let distance = int(p.Bits.[n+0] ||| p.Bits.[n+1] <<< 8).это правильный способ конвертировать немного в int?Правильны ли мои побитовые операции?Поскольку я сам изучал F # с нуля, я не уверен, но это не приводит к ошибкам синтаксиса.

Тем не менее, это означает, что все мои измерения глубины выходят как 0. Если у меня есть это как байт, они немного более чувствительны, но они не работают со следующей строкой (это в c #, но у меня естьего версия F # ... делает то же самое!) byte intensity = (byte)(255 – (255 * Math.Max(distance – minDist, 0) / (distOffset)));

По сути, я не могу заставить его делать что-либо, кроме как дать мне 255 за каждую выходную интенсивность.

Любая помощь будетБуду очень признателен и извиняюсь за неясные вещи, которые я пытаюсь сделать!Вероятно, следует просто использовать C #!

Спасибо

1 Ответ

5 голосов
/ 05 октября 2011

Фрагмент ниже показывает, что преобразование из двух смежных bytes из array в int работает правильно:

let bytes = [|1uy;1uy|]
let distance = int bytes.[0] ||| (int bytes.[1] <<< 8)
printfn "%08X" distance
00000101
val bytes : byte [] = [|1uy; 1uy|]
val distance : int = 257
...