Преобразование координат In32Rect в Span <BGRA>с использованием Azure Kinect DK - PullRequest
2 голосов
/ 14 июля 2020

Я работал над созданием серии руководств с использованием нового Azure Kinect DK, и я наткнулся на то, что меня озадачило.

Это приложение WPF с шаблоном MvvM который принимает выходные данные от Kinect и имеет поле со списком, позволяющее пользователю выбирать тип вывода из различных опций. . Я обучил простую модель с несколькими фирменными безалкогольными напитками, и она правильно определяет бренд и дает мне ограничивающую рамку, которая ссылается на% исходного изображения для позиции. пикселей в Span, используя следующий код:

<BGRA> colourBuffer = capture.Color.GetPixels<BGRA>().Span;

Span<BGRA> outputBuffer = outputImage.GetPixels<BGRA>().Span;

Моя цель - затемнить пиксели вывода цветной камеры, что я уже успешно делаю для отслеживания тела: Успешное затенение изображений

У меня есть прогнозы по бренду на основе искусственного интеллекта пользовательского видения, которые представлены в виде ограничивающих рамок, представленных в процентах от исходного изображения. Я конвертирую их в Int32Rects для более простого использования с соотношением сторон выходного изображения цветной камеры (1920x1080).

Моя проблема в том, что когда я затеняю пиксели, диапазон не соответствует пикселю I ' м штриховки. Весь код находится здесь: https://github.com/craiggilchrist/mancavecoding-kinectdk/blob/feature/tutorial-3/src/Part%201%20-%20Connecting/KinectViewModel.cs, но особенно важная часть заключается в следующем:


foreach (var prediction in _predictions)
{
    // Pixels to colour will start at the top left pixel and finish after the width plus height has been iterated.
    var bbX = (int)Math.Round(prediction.BoundingBox.Left * _colourWidth);
    var bbX2 = bbX + ((int)Math.Round(prediction.BoundingBox.Width * _colourWidth));

    var bbY = (int)Math.Round(prediction.BoundingBox.Top * _colourHeight);
    var bbY2 = bbY + ((int)Math.Round(prediction.BoundingBox.Height * _colourHeight));

    var region = new Int32Rect(
        (int)(capture.Color.WidthPixels * prediction.BoundingBox.Left),
        (int)(capture.Color.HeightPixels * prediction.BoundingBox.Top),
        (int)(capture.Color.WidthPixels * prediction.BoundingBox.Width),
        (int)(capture.Color.HeightPixels * prediction.BoundingBox.Height));

        for (int x = region.X; x < region.X + region.Width; x++)
        {
            for (int y = region.Y; y < region.Y + region.Height; y++)
            {
                outputBuffer[(x * y)].R = 255;
            }
        }
    }

В результате следующие пиксели окрашиваются в красный цвет: Плохо закрашенные пиксели

Я не могу понять, как правильно пройти через непрерывную память и t ie вернуться к прямоугольникам, которые мне нужно затенять.

Кто-нибудь может помочь?

1 Ответ

1 голос
/ 14 июля 2020

Оказывается, я просто был глуп с моей oop. Правильным значением l oop должно быть:

for (int y = region.Y; y < region.Y + region.Height; y++)
{
    for (int x = region.X; x < region.X + region.Width; x++)
    {
        var index = (y * _colourWidth) + x;
        outputBuffer[index].R = 255;
    }
}
...