You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Unity中从Azure Kinect获取并显示正确的彩色图像?

问题原因分析

你当前的代码错误地套用了深度图像的处理逻辑到彩色图像上,导致颜色异常:

  1. 彩色图像格式为ColorBGRA32,每个像素由**4个字节(B、G、R、A)**组成,但你用MemoryMarshal.Cast<byte, ushort>将其转换为ushort类型(深度图像的单像素格式),破坏了彩色数据的结构。
  2. 你用深度最大值计算灰度值,并将R/G/B通道设为同一值,自然只会显示黑白图像。
修正后的彩色图像处理代码

替换你添加的彩色图像处理代码为以下内容:

if (bodyFrameCapture.Color != null)
{
    Microsoft.Azure.Kinect.Sensor.Image colorImage = bodyFrameCapture.Color;
    // 直接获取彩色图像的原始字节Span(ColorBGRA32格式:每个像素4字节,顺序为B→G→R→A)
    var colorFrameSpan = colorImage.Memory.Span;
    
    currentFrameData.ColorImageWidth = colorImage.WidthPixels;
    currentFrameData.ColorImageHeight = colorImage.HeightPixels;
    int requiredSize = currentFrameData.ColorImageWidth * currentFrameData.ColorImageHeight * 4;

    // 确保目标数组大小匹配,避免越界
    if (currentFrameData.ColorImage == null || currentFrameData.ColorImage.Length != requiredSize)
    {
        currentFrameData.ColorImage = new byte[requiredSize];
    }
    currentFrameData.ColorImageSize = requiredSize;

    // 直接复制彩色图像的原始字节数据到目标数组
    colorFrameSpan.CopyTo(currentFrameData.ColorImage.AsSpan());

    // (可选)如果Unity RawImage显示颜色颠倒(蓝红互换),取消下面注释转换通道顺序
    // 因为Unity默认Texture2D用RGBA格式,而Kinect输出的是BGRA
    /*
    for (int i = 0; i < currentFrameData.ColorImageSize; i += 4)
    {
        byte temp = currentFrameData.ColorImage[i]; // 保存B通道
        currentFrameData.ColorImage[i] = currentFrameData.ColorImage[i + 2]; // 替换B为R
        currentFrameData.ColorImage[i + 2] = temp; // 替换R为原来的B
    }
    */
}
显示端Texture设置注意事项

在将ColorImage数组加载到RawImage时,确保对应的Texture2D格式匹配:

  • 如果未转换通道(保留BGRA),创建Texture2D时指定TextureFormat.BGRA32
  • 如果转换了通道(改为RGBA),指定TextureFormat.RGBA32

示例加载代码:

// 假设texture是你用于显示的Texture2D实例
texture.LoadRawTextureData(currentFrameData.ColorImage);
texture.Apply();

内容的提问来源于stack exchange,提问作者Wan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 13:00:02