main函数
int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
CDepthBasics application;
application.Run(hInstance, nCmdShow);
}
wWinMain 是Win32程序的入口,wWinMain是unicode版,WinMain是ANSI版。编码不同,如果程序中要有中文,就用wWinMain。
#define _tWinMain wWinMain
#define _tWinMain WinMain
int WINAPI wWinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPWSTR lpCmdLine,
int nShowCmd
);
在不考虑异常处理的情况下,一个简单的Kinect编程模型包含设备对象获取、参数设置、设备启动、时间注册、事件处理及设备关闭等方面。
用KinectSensor.KinectSensors[0]或KinectSensor.FirstOrDefault()获取当前接入的Kinect传感器的对象实例。
KinectSensor.ColorStream.Enable()方法启用视频流;
KinectSensor.DepthStream.Enable()方法启用深度流;
KinectSensor.SkeletonStream.Enable()方法启用骨骼跟踪;
这些方法都有重载参数,用于设定数据流的不用的质量、格式。
KinectSensor.ColorFrameReady来注册彩色图像事件;
KinectSensor.DepthFrameReady来注册深度图像事件;
KinectSensor.SkeletonFrameReady来注册骨骼跟踪事件;
可以使用LINQ的forench语法对当前活动连接的Kinect传感器进行遍历
KinectSensor.KinectSensors.Count 当前Kinect传感器的数量
KinectSensor.KinectSensor[0]选择第一个Kinect设备
aa.AllFrameReady+=new EventHandle<AllFrameReadyEventArgs>(aa_AllFremesReady);注册事件,保证彩色图像、深度图像和骨骼数据同步
三个数据同时使用的时候这样才能同步一致,否则分别注册则会带来数据同步的问题:不同的事件处理程序分属不同的工作线程,无法确保同一时刻各自数据对齐。
针对相关的枚举项可以查看官方文档
彩色图像流处理:BGR32图像的1像素对应4字节(32位),四个字节分别是:B(Blue)、G(Green)、R(Red)和阿尔法通道(代表透明度)
深度图像:1.定义深度图像的有效视角范围 const float MaxDepthDistance 最大视距 const float MinDepthDistance 最小视距 MaxDepthDistanceOffset 前面二者之差
private const int RedIndex =2; private const int GreenIndex=1;BlueIndex=0;
2. 单色直方图计算公式。返回256色灰阶,颜色越黑越远,越白越近。 MaxDepthDistanceOffset 数值控制在0~255范围之内
3.添加显示控件,显示深度图像
4.从深度数据帧转换成彩色图像帧
Kinect与目标物体间的距离公式如下:int depth=rawDepthData[depthIndex]>>DepthImageFrame.PlayerIndexBitmaskWidth; 深度图像的每个像素由两个字节共十六位组成,每个像素的高13位代表从Kinect红外摄像头到最近物体对象的距离,以毫米为单位。低3位字节表示跟踪的用户索引编号,转换为数值类型(0~7),
5.事件处理
6.编译后运行
骨骼跟踪:骨骼跟踪事件注册:aa.SkeletonFrameReady+=new EventHandler<SkeletonFrameReadyEventArgs>(aa.SkeletonFrameReady);
骨骼跟踪事件处理、NUI坐标转换:把Skeleton坐标映射到彩色图像坐标中,并根据图片控件imageCamera做一次等比例适应;
关闭Kinect设备:aa.Stop(); 和 stopKinect();
KinectSensorChooser控件可以进行异常代码处理;