Kinect学习DAY3:常用API
2014-01-12 18:09
483 查看
/article/1919426.html
zouxy09的文章,写的很详细,个别地方补充一点。
1.
初始化
参数是可以用“|”的形式使用多个的。比如NuiInitialize(NUI_INITIALIZE_FLAG_USES_AUDIO | NUI_INITIALIZE_FLAG_USES_COLOR)
Kinect sensor initialization options when calling NuiInitialize. These may be combined using a
bitwise OR.
2.
定义事件句柄
NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX 对应
3.2 dwImageFrameFlags
Header: NuiImageCamera.h3.3 dwFrameLimitkinect缓冲的图片数,可以用上表中绿色的项,最大为4个,一般推荐为23.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接口
9. 关闭kinect
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 abitwise 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. |
定义事件句柄
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 value | NUI_IMAGE_RESOLUTION eResolution value |
---|---|
NUI_IMAGE_TYPE_DEPTH | NUI_IMAGE_RESOLUTION_640x480 or NUI_IMAGE_RESOLUTION_320x240 or NUI_IMAGE_RESOLUTION_80x60 |
NUI_IMAGE_TYPE eImageType value | NUI_IMAGE_RESOLUTION eResolution value |
---|---|
NUI_IMAGE_TYPE_DEPTH_AND_PLAYER_INDEX | NUI_IMAGE_RESOLUTION_320x240 or NUI_IMAGE_RESOLUTION_80x60 |
NUI_INITIALIZE_FLAG_USES_COLOR 对应
NUI_IMAGE_TYPE eImageType value | NUI_IMAGE_RESOLUTION eResolution value |
---|---|
NUI_IMAGE_TYPE_COLOR | NUI_IMAGE_RESOLUTION_1280x960 or NUI_IMAGE_RESOLUTION_640x480 |
NUI_IMAGE_TYPE_COLOR_YUV | NUI_IMAGE_RESOLUTION_640x480 |
NUI_IMAGE_TYPE_COLOR_RAW_YUV | NUI_IMAGE_RESOLUTION_640x480 |
NUI_IMAGE_TYPE_COLOR_INFRARED | NUI_IMAGE_RESOLUTION_640x480 |
设置了一些和视频帧有关的选项,1.8中已经有用到了,可以按‘|’方式同时使用多个下表红色项。
NUI_IMAGE Flags
Constant | Value |
---|---|
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_VALUE | 0 |
NUI_IMAGE_STREAM_FLAG_DISTINCT_OVERFLOW_DEPTH_VALUES | 0x00040000 |
NUI_IMAGE_STREAM_FLAG_ENABLE_NEAR_MODE | 0x00020000 |
NUI_IMAGE_STREAM_FLAG_SUPPRESS_NO_FRAME_DATA | 0x00010000 |
NUI_IMAGE_STREAM_FLAG_TOO_FAR_IS_NONZERO | 0x00040000 |
NUI_IMAGE_STREAM_FRAME_LIMIT_MAXIMUM | 4 |
NUI_IMAGE_PLAYER_INDEX_SHIFT | 3 |
NUI_IMAGE_PLAYER_INDEX_MASK | ((1 << NUI_IMAGE_PLAYER_INDEX_SHIFT)-1) |
从刚才打开数据流的流句柄中得到该帧数据,读取到的数据地址存于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()
相关文章推荐
- 鸟哥Java学习之集合框架--常用对象API
- java学习笔记——API中的常用类和StringBuffer
- JAVA学习第二十九课(常用对象API)- String类
- JAVA学习第三十课(常用对象API)- String类:类方法练习
- C#面向对象与常用API的学习
- JAVA学习第四十课(常用对象API)- Map集合练习
- Java基础学习笔记十三 常用API之正则表达式、Date、DateFormat、Calendar
- 鸟哥Java学习之集合框架工具类--常用对象API
- Java学习笔记之常用API学习笔记3
- JavaSE学习总结第13天_API常用对象3
- SSH学习(十)Hibernate常用API详解及源码分析
- pthread学习笔记(二)--pthread常用API及简单介绍
- JAVA基础学习day16--集合三-Map、HashMap,TreeMap与常用API
- Java基础学习笔记十四 常用API之基本类型包装类
- Java学习笔记10——Java常用API
- Android JNI和NDK学习(07)--JNI的常用API
- JAVA学习第三十二课(常用对象API)- 基本数据类型对象包装类
- 黑马学习笔记_常用API总结(三)
- JavaSE学习总结第14天_API常用对象4