Kinect学习DAY3:常用API

原创 2014年01月12日 18:09:19

http://blog.csdn.net/zouxy09/article/details/8146266

zouxy09的文章,写的很详细,个别地方补充一点。


1. 初始化

HRESULT NuiInitialize(
         DWORD dwFlags
)
参数是可以用“|”的形式使用多个的。比如NuiInitialize(NUI_INITIALIZE_FLAG_USES_AUDIO | NUI_INITIALIZE_FLAG_USES_COLOR)

NUI_INITIALIZE Flags

Kinect sensor initialization options when calling NuiInitialize. These may be combined using a bitwise OR.

Constant Description
NUI_INITIALIZE_DEFAULT_HARDWARE_THREAD This flag was deprecated in version 1.5; it is no longer used.
NUI_INITIALIZE_FLAG_USES_AUDIO Initialize the sensor to provide audio data.
NUI_INITIALIZE_FLAG_USES_COLOR Initialize the sensor to provide color data.
NUI_INITIALIZE_FLAG_USES_DEPTH Initialize the sensor to provide depth data.
NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX Initialize the sensor to provide depth data with a player index.
NUI_INITIALIZE_FLAG_USES_SKELETON Initialize the sensor to provide skeleton data.

2. 定义事件句柄

HANDLE WINAPI CreateEvent(
  _In_opt_  LPSECURITY_ATTRIBUTES lpEventAttributes,
  _In_      BOOL bManualReset,
  _In_      BOOL bInitialState,
  _In_opt_  LPCTSTR lpName
);

lpEventAttributes 为NULL时则该句柄不能被子程序继承;
bManualReset 为TRUE时需要用ResetEvent函数来重置事件,否则一段时间等待后自动重置;
bInitialState 表示事件初始状态,为FALSE时无初始状态;
lpName 命名事件对象的名称,这里为空是未命名。

3. 打开数据流
HRESULT NuiImageStreamOpen(
         NUI_IMAGE_TYPE eImageType,
         NUI_IMAGE_RESOLUTION eResolution,
         DWORD dwImageFrameFlags,
         DWORD dwFrameLimit,
         HANDLE hNextFrameEvent,
         HANDLE *phStreamHandle
)
3.1 eImageType 与eResolution 是和之前初始化中的flag是对应的
NUI_INITIALIZE_FLAG_USES_DEPTH 对应
NUI_IMAGE_TYPE eImageType valueNUI_IMAGE_RESOLUTION eResolution value
NUI_IMAGE_TYPE_DEPTHNUI_IMAGE_RESOLUTION_640x480 or NUI_IMAGE_RESOLUTION_320x240 or NUI_IMAGE_RESOLUTION_80x60
NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX 对应
NUI_IMAGE_TYPE eImageType valueNUI_IMAGE_RESOLUTION eResolution value
NUI_IMAGE_TYPE_DEPTH_AND_PLAYER_INDEXNUI_IMAGE_RESOLUTION_320x240 or NUI_IMAGE_RESOLUTION_80x60
NUI_INITIALIZE_FLAG_USES_COLOR 对应
NUI_IMAGE_TYPE eImageType valueNUI_IMAGE_RESOLUTION eResolution value
NUI_IMAGE_TYPE_COLORNUI_IMAGE_RESOLUTION_1280x960 or NUI_IMAGE_RESOLUTION_640x480
NUI_IMAGE_TYPE_COLOR_YUVNUI_IMAGE_RESOLUTION_640x480
NUI_IMAGE_TYPE_COLOR_RAW_YUVNUI_IMAGE_RESOLUTION_640x480
NUI_IMAGE_TYPE_COLOR_INFRAREDNUI_IMAGE_RESOLUTION_640x480
3.2 dwImageFrameFlags
设置了一些和视频帧有关的选项,1.8中已经有用到了,可以按‘|’方式同时使用多个下表红色项。

NUI_IMAGE Flags

ConstantValue
NUI_IMAGE_DEPTH_MAXIMUM((4000 << NUI_IMAGE_PLAYER_INDEX_SHIFT) | NUI_IMAGE_PLAYER_INDEX_MASK)
NUI_IMAGE_DEPTH_MINIMUM(800 << NUI_IMAGE_PLAYER_INDEX_SHIFT)
NUI_IMAGE_DEPTH_NO_VALUE0
NUI_IMAGE_STREAM_FLAG_DISTINCT_OVERFLOW_DEPTH_VALUES0x00040000
NUI_IMAGE_STREAM_FLAG_ENABLE_NEAR_MODE0x00020000
NUI_IMAGE_STREAM_FLAG_SUPPRESS_NO_FRAME_DATA0x00010000
NUI_IMAGE_STREAM_FLAG_TOO_FAR_IS_NONZERO0x00040000
NUI_IMAGE_STREAM_FRAME_LIMIT_MAXIMUM4
NUI_IMAGE_PLAYER_INDEX_SHIFT3
NUI_IMAGE_PLAYER_INDEX_MASK((1 << NUI_IMAGE_PLAYER_INDEX_SHIFT)-1)

Header: NuiImageCamera.h

3.3 dwFrameLimit

kinect缓冲的图片数,可以用上表中绿色的项,最大为4个,一般推荐为2

3.4 hNextFrameEvent

下一帧是否可用事件的句柄,需要用WaitForSingleObject来检查

3.5 phStreamHandle

输出,指向当前视频流的句柄,不能为空。

4. 等待下一帧可用的事件响应       WaitForSingleObject(nextColorFrameEvent, INFINITE)==0    

5. 得到下一帧

HRESULT NuiImageStreamGetNextFrame(
         HANDLE hStream,
         DWORD dwMillisecondsToWait,
         const NUI_IMAGE_FRAME **ppcImageFrame
)
引用zouxy09的博客(后文中引用位置均用超链接给出原地址):

从刚才打开数据流的流句柄中得到该帧数据,读取到的数据地址存于pImageFrame。第二个参数表示你延时多少微秒拿数据,0表示,我立刻拿。

如果你没有遇到什么错误的话,那么刚才KINECT就捕获了一副画面,并将该画面的信息保存在一个NUI_IMAGE_FRAME结构中,pImageFrame指向该结构的地址。

pImageFrame包含了很多有用信息,包括:图像类型,分辨率,图像缓冲区,时间戳等等。

NuiImageStreamReleaseFrame(colorStreamHandle, pImageFrame );  在当前帧使用完后释放本帧数据。

6、INuiFrameTexture接口
INuiFrameTexture * pTexture = pImageFrame->pFrameTexture;
一个容纳图像帧数据的对象,类似于Direct3D纹理,但是只有一层(不支持mip-maping)。

7. NUI_LOCKED_RECT 对象来保存数据
typedef struct _NUI_LOCKED_RECT {
    INT Pitch;
    int size;
    BYTE *pBits;
} NUI_LOCKED_RECT;
Pitch
	The number of bytes of data in a row.
size
	The size of pBits, in bytes.
pBits
	A pointer to the upper-left corner of the rectangle.

pTexture->LockRect(0, &LockedRect, NULL, 0); 这里的LockRect为INuiFrameTexture的共有成员函数。
pTexture->UnlockRect(0); 当前帧使用完后需要释放锁定。
8. 将数据转化为OPENCV的MAT格式
for (int i=0; i<image.rows; i++) 
                {
					uchar *ptr = image.ptr<uchar>(i);  //第i行的指针
					
					//每个字节代表一个颜色信息,直接使用uchar
                    uchar *pBuffer = (uchar*)(LockedRect.pBits) + i * LockedRect.Pitch;
                    for (int j=0; j<image.cols; j++) 
                    { 
                        ptr[3*j] = pBuffer[4*j];  //内部数据是4个字节,0-1-2是BGR,第4个现在未使用 
                        ptr[3*j+1] = pBuffer[4*j+1]; 
                        ptr[3*j+2] = pBuffer[4*j+2]; 
                    } 
				} 

9. 关闭kinect
void NuiShutdown()


Kinect知识学习

1. 简介 Kinect (Kinect for XBOX 360, kinetics+connection) 是Mircosoft应用与XBOX360主机的peripheral设备,通过语音指令或...
  • hustfzt
  • hustfzt
  • 2016年09月06日 08:21
  • 844

Kinect API接口学习笔记

应用层API解析 三大核心组件: NUI API:SDK的核心,用来处理色彩图像流,深度图像数据,骨骼跟踪和控制物理Kinect设备等。 Kinect Audio DMO:提供波束成形和音源定位...
  • u010124227
  • u010124227
  • 2014年06月05日 16:50
  • 669

【Unity】Kinect一些常用的API

先开好这个坑,之后用到就补充,方便回顾。
  • qq_18995513
  • qq_18995513
  • 2016年11月16日 00:48
  • 689

kinect2.0 API综述

kinect 2.0开发第一步,研究kinect2.0 API。 本文主要是翻译官方文档,另外加入自己的一点理解和实验 文档网址: https://msdn.microsoft.com/en-us...
  • ktigerhero3
  • ktigerhero3
  • 2015年11月19日 17:28
  • 1489

Kinect API 简述

应用层三大组件: NUI API: SDK的核心,用来处理彩色图像流、深度图像数据、骨骼跟踪和控制/管理Kinect设备等。 Kinect Audio DMO: 提供波束成形和音源定位功能。 ...
  • Lx85416281
  • Lx85416281
  • 2014年12月07日 13:45
  • 1126

Kinect For Windows SDK 2.0的解读之《KinectV2开发手册》

转载自 自己的博客,由于百度迟迟没有收录,在这里转发。 Kinect For Windows SDK 2.0的解读之一《开发手册》 这二天在外面出差,回来才发现26号早晨微软已经通知我可以下...
  • guoming0000
  • guoming0000
  • 2013年12月09日 23:25
  • 18937

Kinect, OpenNI, PCL学习资料汇总~

最近一直困于opencv向PCL的转换~ 就是深度图像转为点云咯~ 如果你也想从Mat数据类型转化为 pcl::PointCloud cloud,请戳这里《to be continued》 终...
  • wangzhebupt
  • wangzhebupt
  • 2014年04月15日 16:25
  • 2510

从零开始学习Kinect编程(一) 4.20

今天是第一天开始学习Kinect 之前并没有接触过这个东西 1,Kinect是什么?–百度找的 =.= Kinectfor Xbox 360,简称 Kinect,是由微软开发,应用于Xbox 3...
  • baidu_36765593
  • baidu_36765593
  • 2017年04月20日 19:10
  • 455

Node.js基础学习之常见API理解

问题1:process.exit事件 process.on('exit', function(code) { // 这里必须只能是同步代码快,而不能是异步的 setTimeout(funct...
  • liangklfang
  • liangklfang
  • 2016年03月24日 21:00
  • 1979

java常用API知识点总结

黑马程序员_JAVA常用类API(StringBuffer类,数组高级应用,包装类  34人阅读 评论(0) 收藏 举报 ------- android培训、java培训、期待与您交流!---...
  • zhuimengtianya33
  • zhuimengtianya33
  • 2015年08月22日 19:47
  • 1441
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Kinect学习DAY3:常用API
举报原因:
原因补充:

(最多只允许输入30个字)