提问者:小点点

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


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

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

我正在研究的最新选项是使用蓝色自定义视觉人工智能使用品牌识别。我用多个品牌的软饮料训练了一个简单的模型,它正确地检测了品牌,并给我一个边界框,引用了该位置的原始图像的%。

我使用以下代码将彩色相机输出为一个范围内的像素:

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

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

我的目标是对彩色摄像机输出的像素进行着色,我已经成功地进行了身体跟踪:成功地对图片进行着色

我已经从定制的视觉AI中得到了我的品牌预测,它是以原始图像的百分比表示的边界框。我将这些转换为Int32Rects,以便更容易地使用彩色相机输出的纵横比(1920x1080)。

我的问题是,当我对像素着色时,跨度与我正在着色的像素不对应。整个代码如下:https://github.com/craiggilchrist/mancavecoding-kinectdk/blob/feature/tutorial-3/src/Part1-连接/KinectViewModel。但特别重要的是:


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

这将导致以下像素被着色为红色:着色严重的像素

我不知道如何正确地跨过连续的记忆,并将其与我需要阴影的矩形联系起来。

有人能帮忙吗?


共1个答案

匿名用户

原来我只是愚蠢地使用了我的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;
    }
}