kinect for windows - DepthBasics-D2D 学习笔记一

来源:互联网 发布:数据泄漏防护系统 破解 编辑:程序博客网 时间:2024/04/29 15:30

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。

从上面这段程序就可以看到,_tWinMain是应用程序的入口函数,这里是使用它的宏,定义在tchar.h头文件里,为什么要这样作宏定义的呢?由于Windows的应用程序要适应UNICODE和以前单字符的应用程序,由于Windows这两个API的定义是不一样的,如下:
UNICODE的定义:
#define _tWinMain wWinMain
单字符的定义:
#define _tWinMain WinMain
只要经过这样的宏定义后,就可以适应不同字符宽度的函数接口了。由于我是采用UNICODE编译的,所以这里使用wWinMain函数定义,下面再把它的定义找出来,如下:
int WINAPI wWinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPWSTR lpCmdLine,
int nShowCmd
);
这里要详细地解释一下函数wWinMain的参数,它有四个参数。
hInstance是当前应用程序的实例句柄,一般用来区分不同的资源使用。
hPrevInstance是以前Win98使用的句柄,在Win2000以后的操作系统里都是空值NULL
lpCmdLine是命令行参数,比如你在Windows开始菜单里运行一个程序,并添加参数在后面,就会传递给应用程序,后面再详细讨论。
nShowCmd是窗口的显示方式,比如最大化显示,最小化显示,还是正常显示。
 Windows运行程序时,是通过运行库里的启动代码来调用wWinMain函数
详见http://www.cnblogs.com/hicjiajia/archive/2011/02/15/1954942.html

在不考虑异常处理的情况下,一个简单的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控件可以进行异常代码处理;


0 0