Я работал над созданием серии руководств с использованием нового 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 вернуться к прямоугольникам, которые мне нужно затенять.
Кто-нибудь может помочь?