如何在Unity中从Azure Kinect获取并显示正确的彩色图像?
问题原因分析
你当前的代码错误地套用了深度图像的处理逻辑到彩色图像上,导致颜色异常:
- 彩色图像格式为
ColorBGRA32,每个像素由**4个字节(B、G、R、A)**组成,但你用MemoryMarshal.Cast<byte, ushort>将其转换为ushort类型(深度图像的单像素格式),破坏了彩色数据的结构。 - 你用深度最大值计算灰度值,并将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
相关产品推荐
相关产品推荐

