Xbox One Kinect竖置使用:BodyScanner-Kinect代码修改咨询
针对BodyScanner-Kinect竖置Kinect的修改方案
核心修改点:帧旋转、坐标映射调整、骨骼坐标修正
以下是具体的代码修改步骤,对应仓库中的常见文件结构:
1. 彩色/深度帧的显示旋转
找到处理帧显示的主逻辑文件(通常是MainWindow.xaml.cs),在彩色帧和深度帧的转换代码后添加旋转处理:
彩色帧修改示例:
// 原代码:转换彩色帧为WriteableBitmap using (var colorBitmap = new WriteableBitmap(colorFrame.FrameDescription.Width, colorFrame.FrameDescription.Height, 96.0, 96.0, PixelFormats.Bgr32, null)) { colorFrame.CopyConvertedFrameDataToIntPtr(colorBitmap.BackBuffer, (uint)(colorFrame.FrameDescription.Width * colorFrame.FrameDescription.Height * 4), ColorImageFormat.Bgra); colorBitmap.Lock(); colorBitmap.AddDirtyRect(new Int32Rect(0, 0, colorBitmap.PixelWidth, colorBitmap.PixelHeight)); colorBitmap.Unlock(); // 新增:旋转90度(根据实际摆放方向调整角度,比如逆时针用270) var rotatedColorBitmap = new TransformedBitmap(colorBitmap, new RotateTransform(90)); // 将旋转后的图像赋值给UI控件 ColorImage.Source = rotatedColorBitmap; }
深度帧修改示例:
同样在深度帧转换完成后添加旋转逻辑,确保深度画面和彩色画面同步竖置:
// 原深度帧转换代码... var rotatedDepthBitmap = new TransformedBitmap(depthBitmap, new RotateTransform(90)); DepthImage.Source = rotatedDepthBitmap;
2. 坐标映射修正(关键:解决深度-彩色对齐问题)
Kinect默认的CoordinateMapper是基于横置摄像头的,竖置后X/Y坐标互换,需要修改坐标映射逻辑(在帧处理类或主窗口代码中):
// 原代码:获取深度转彩色的坐标 // var colorPoint = _coordinateMapper.MapDepthPointToColorPoint(depthFrame.Format, depthPoint, colorFrame.Format); // 修改后:先交换深度点的X/Y,再映射,最后交换彩色点的X/Y var rotatedDepthPoint = new DepthPoint { X = depthPoint.Y, // 横置时的高度变为竖置后的宽度 Y = depthPoint.X, // 横置时的宽度变为竖置后的高度 Depth = depthPoint.Depth }; // 修正坐标范围(深度帧原尺寸512x424,竖置后变为424x512) rotatedDepthPoint.X = Math.Clamp(rotatedDepthPoint.X, 0, colorFrame.FrameDescription.Height - 1); rotatedDepthPoint.Y = Math.Clamp(rotatedDepthPoint.Y, 0, colorFrame.FrameDescription.Width - 1); var colorPoint = _coordinateMapper.MapDepthPointToColorPoint(depthFrame.Format, rotatedDepthPoint, colorFrame.Format); // 交换彩色点的X/Y,适配竖置后的画面 colorPoint = new ColorPoint { X = colorPoint.Y, Y = colorPoint.X }; // 修正彩色点坐标范围 colorPoint.X = Math.Clamp(colorPoint.X, 0, colorFrame.FrameDescription.Width - 1); colorPoint.Y = Math.Clamp(colorPoint.Y, 0, colorFrame.FrameDescription.Height - 1);
3. 骨骼跟踪坐标修正(如果项目用到骨骼)
如果仓库包含人体骨骼跟踪逻辑,需要修正关节的相机空间坐标,适配竖置后的坐标系:
// 原代码:获取关节原始坐标 // var jointPos = body.Joints[JointType.SpineBase].Position; // 修改后:交换X/Y并调整坐标方向(根据旋转方向调整符号,顺时针90度示例) var originalPos = body.Joints[JointType.SpineBase].Position; var rotatedPos = new CameraSpacePoint { X = originalPos.Y, Y = -originalPos.X, // 翻转Y轴适配竖置后的坐标系 Z = originalPos.Z };
4. 需要修改的文件定位
根据BodyScanner-Kinect仓库结构,主要修改以下文件:
MainWindow.xaml.cs:帧读取、显示旋转的核心逻辑- 若存在
FrameProcessor.cs/DepthProcessor.cs:坐标映射修正的逻辑 - 若存在
BodyTracker.cs:骨骼坐标修正的逻辑
测试时先验证画面显示是否正确竖置,再检查深度与彩色帧的对齐情况,最后调整骨骼跟踪的坐标适配。
内容的提问来源于stack exchange,提问作者Ali Kariminejad
相关产品推荐
相关产品推荐

