使用 Azure Kinect DK 将 In32Rect 坐标转换为 Span<BGRA>

Converting In32Rect coordinates to Span<BGRA> using Azure Kinect DK

我一直在使用新的 Azure Kinect DK 制作一系列教程,但我偶然发现了一些让我感到困惑的东西。

这是一个 WPF 应用程序,采用 MvvM 模式,从 Kinect 获取输出,并有一个组合框,允许用户select 各种选项的输出类型。

我正在研究的最新选项是使用 Azure 自定义视觉 AI 来使用品牌识别。我已经用多个品牌的软饮料训练了一个简单的模型,它正确地检测到品牌并为我提供了一个边界框,该边界框引用了该位置的原始图像的百分比。

我使用以下代码将彩色相机输出作为 Span 中的像素:

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

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

我的目标是对彩色相机输出的像素进行着色,我已经成功地完成了 body 跟踪: Successfully shading pictures

我从自定义视觉 AI 得到了我的品牌预测,它以边界框的形式出现,表示为原始图像的百分比。我正在将它们转换为 Int32Rects 以便于使用彩色相机输出的纵横比 (1920x1080)。

我的问题是,当我对像素进行着色时,跨度与我正在着色的像素不对应。整个代码在这里: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;
            }
        }
    }

这导致以下像素呈红色阴影: Badly shaded pixels

我无法弄清楚如何正确地跨越连续内存并将其绑定回我需要着色的矩形。

有人能帮忙吗?

原来我只是在用我的 for 循环做傻事。正确的 for 循环应该是:

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;
    }
}