您的位置:首页 > 其它

Kinect学习DAY3:常用API

2014-01-12 18:09 483 查看
/article/1919426.html

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.
ConstantDescription
NUI_INITIALIZE_DEFAULT_HARDWARE_THREADThis flag was deprecated in version 1.5;
it is no longer used.
NUI_INITIALIZE_FLAG_USES_AUDIOInitialize the sensor to provide audio data.
NUI_INITIALIZE_FLAG_USES_COLORInitialize the sensor to provide color data.
NUI_INITIALIZE_FLAG_USES_DEPTHInitialize the sensor to provide depth data.
NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEXInitialize the sensor to provide depth data with a player index.
NUI_INITIALIZE_FLAG_USES_SKELETONInitialize 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.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接口

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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: