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

C# 将In32Rect坐标转换为Span<;BGRA>;使用Azure Kinect DK,c#,azure,.net-core,kinect-v2,C#,Azure,.net Core,Kinect V2,我一直在使用新的Azure Kinect DK制作一系列教程,我偶然发现了一些让我困惑的东西 它是一个WPF应用程序,具有MvvM模式,从Kinect获取输出,并具有一个组合框,允许用户从各种选项中选择输出类型 我最近的一个选择是使用azure定制视觉AI进行品牌识别。我用多个品牌的软饮料训练了一个简单的模型,它正确地检测到了品牌,并给了我一个边界框,其中引用了位置原始图像的% 我使用以下代码将彩色相机输出为一个范围内的像素: <BGRA> colourBuffer = captur

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

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

我最近的一个选择是使用azure定制视觉AI进行品牌识别。我用多个品牌的软饮料训练了一个简单的模型,它正确地检测到了品牌,并给了我一个边界框,其中引用了位置原始图像的%

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

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

Span<BGRA> outputBuffer = outputImage.GetPixels<BGRA>().Span;
colorbuffer=capture.Color.GetPixels().Span;
Span outputBuffer=outputImage.GetPixels().Span;
我的目标是对彩色摄像机输出的像素进行着色,我已经成功地进行了人体跟踪:

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

我的问题是,当我对像素着色时,跨度与我正在着色的像素不对应。整个代码都在这里:但特别重要的部分是:


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


foreach(var预测在_预测中)
{
//要上色的像素将从左上角的像素开始,在迭代宽度加高度后结束。
var bbX=(int)Math.Round(prediction.BoundingBox.Left*\u colorWidth);
var bbX2=bbX+((int)数学圆整(prediction.BoundingBox.Width*_colorWidth));
var bbY=(int)Math.Round(prediction.BoundingBox.Top*_colorHeight);
var bbY2=bbY+((int)Math.Round(prediction.BoundingBox.Height*_colorheight));
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);
对于(int x=region.x;x
这将导致以下像素被着色为红色:

我不知道如何正确地跨越连续内存并将其绑定回需要着色的矩形


有人能帮忙吗?

原来我的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;
    }
}
for(int y=region.y;y