Kinect V2 开发专题(4)骨骼/深度/红外/摄像头数据获取
2016-09-13 17:00
441 查看
【原文:http://blog.csdn.net/bbdxf/article/details/44857099】
1、骨骼数据获取
2、深度数据获取
3、红外图像获取
4、摄像头数据获取
[cpp] view plain copy
// 获取身体数据
IBodyFrameSource* bodys = nullptr;
bb->get_BodyFrameSource(&bodys); // Body 数据源
INT32 nBodyNum = 0;
bodys->get_BodyCount(&nBodyNum); // 获取body 个数,没用,一直是6
printf("Body Num: %d\n", nBodyNum);
IBodyFrameReader* bodyr = nullptr;
bodys->OpenReader(&bodyr); // 准备读取body数据
while (true)
{
IBodyFrame* bodyf = nullptr;
bodyr->AcquireLatestFrame(&bodyf); // 获取最近的一帧数据
if ( !bodyf )
{
Sleep(100);
printf(".");
continue;
}
IBody* ppBodies[BODY_COUNT] = { 0 };
bodyf->GetAndRefreshBodyData(BODY_COUNT, ppBodies); // 更新所有人身体数据
for (int i = 0; i < BODY_COUNT; ++i)
{
IBody* pBody = ppBodies[i]; // 轮询每个人的信息
if (pBody)
{
BOOLEAN bTracked = false;
hr = pBody->get_IsTracked(&bTracked); // 检测是否被跟踪,即是否有这个人
if (bTracked)
{
Joint joints[JointType_Count];
HandState leftHandState = HandState_Unknown;
HandState rightHandState = HandState_Unknown;
pBody->get_HandLeftState(&leftHandState); // 获取左手的状态
pBody->get_HandRightState(&rightHandState); // 获取右手的状态
hr = pBody->GetJoints(_countof(joints), joints); // 获取身体的骨骼信息,25点
printf("Person %d : Joints[0].Z %.2f\n", i, joints[0].Position.Z); //简单的输出他的信息
}
}
}
for (int i = 0; i < BODY_COUNT; ++i)
{
ppBodies[i]->Release();
}
bodyf->Release();
}
[cpp] view plain copy
/*
Depth min: 500 max: 4500
Frame: 424 512
Buffer size: 217088
*/
int _tmain(int argc, _TCHAR* argv[])
{
printf("Hello, Wellcome to kinect world!\n");
IKinectSensor* pKinect = nullptr;
GetDefaultKinectSensor(&pKinect);
if ( !pKinect)
{
printf("Get Kinect failed!\n");
goto endstop;
}
pKinect->Open();
BOOLEAN bOpen = false;
// 一直等待直到Kinect打开完成
while (!bOpen)
{
pKinect->get_IsOpen(&bOpen);
Sleep(200);
}
IDepthFrameSource* depths = nullptr;
pKinect->get_DepthFrameSource(&depths); // 获取深度数据源
IDepthFrameReader* depthr = nullptr;
depths->OpenReader(&depthr); // 打开深度解析器
while (true)
{
IDepthFrame* depthf = nullptr;
depthr->AcquireLatestFrame(&depthf); // 获取最近的深度数据
if ( !depthf )
{
Sleep(200);
continue;
}
USHORT minds, maxds;
depthf->get_DepthMinReliableDistance(&minds); // 获取最近的有效距离,500
depthf->get_DepthMaxReliableDistance(&maxds); // 获取最远的有效距离,4500
printf("Depth min: %d max: %d\n", minds, maxds);
IFrameDescription* frameDs = nullptr;
depthf->get_FrameDescription(&frameDs); // 获取深度信息的属性
int height, width;
frameDs->get_Height(&height);
frameDs->get_Width(&width);
printf("Frame: %d %d\n", height, width);
UINT ncaps = 0;
UINT16* buff = nullptr;
depthf->AccessUnderlyingBuffer(&ncaps, &buff); // 获取深度数据的指针和大小
//depthf->CopyFrameDataToArray(...); // 讲深度数据Copy到制定的buffer中
printf("Buffer size: %d\n", ncaps);
depthf->Release();
frameDs->Release();
Sleep(200);
}
pKinect->Close();
endstop:
system("pause");
return 0;
}
[cpp] view plain copy
/*
Frame: 424 512
Buffer size: 217088
*/
int _tmain(int argc, _TCHAR* argv[])
{
printf("Hello, Wellcome to kinect world!\n");
IKinectSensor* pKinect = nullptr;
GetDefaultKinectSensor(&pKinect);
if ( !pKinect)
{
printf("Get Kinect failed!\n");
goto endstop;
}
pKinect->Open();
BOOLEAN bOpen = false;
// 一直等待直到Kinect打开完成
while (!bOpen)
{
pKinect->get_IsOpen(&bOpen);
Sleep(200);
}
IInfraredFrameSource* infrareds = nullptr;
pKinect->get_InfraredFrameSource(&infrareds); // 获取红外数据源
IInfraredFrameReader* infraredr = nullptr;
infrareds->OpenReader(&infraredr); // 打开红外解析器
while (true)
{
IInfraredFrame* infraredf = nullptr;
infraredr->AcquireLatestFrame(&infraredf); // 获取最近的红外数据
if (!infraredf)
{
Sleep(200);
continue;
}
IFrameDescription* frameDs = nullptr;
infraredf->get_FrameDescription(&frameDs); // 获取红外信息的属性
int height, width;
frameDs->get_Height(&height);
frameDs->get_Width(&width);
printf("Frame: %d %d\n", height, width);
UINT ncaps = 0;
UINT16* buff = nullptr;
infraredf->AccessUnderlyingBuffer(&ncaps, &buff); // 获取红外数据的指针和大小
//depthf->CopyFrameDataToArray(...); // 将数据Copy到制定的buffer中
printf("Buffer size: %d\n", ncaps);
infraredf->Release();
frameDs->Release();
Sleep(200);
}
pKinect->Close();
endstop:
system("pause");
return 0;
}
[cpp] view plain copy
/*
Frame: 1080 1920
Buffer size: 4147200
*/
int _tmain(int argc, _TCHAR* argv[])
{
printf("Hello, Wellcome to kinect world!\n");
IKinectSensor* pKinect = nullptr;
GetDefaultKinectSensor(&pKinect);
if ( !pKinect)
{
printf("Get Kinect failed!\n");
goto endstop;
}
pKinect->Open();
BOOLEAN bOpen = false;
// 一直等待直到Kinect打开完成
while (!bOpen)
{
pKinect->get_IsOpen(&bOpen);
Sleep(200);
}
IColorFrameSource* colorfs = nullptr;
pKinect->get_ColorFrameSource(&colorfs); // 获取图像数据源
IColorFrameReader* colorfr = nullptr;
colorfs->OpenReader(&colorfr); // 打开解析器
while (true)
{
IColorFrame* colorf = nullptr;
colorfr->AcquireLatestFrame(&colorf); // 获取最近的数据
if (!colorf)
{
Sleep(200);
continue;
}
IFrameDescription* frameDs = nullptr;
colorf->get_FrameDescription(&frameDs); // 获取信息的属性
int height, width;
frameDs->get_Height(&height);
frameDs->get_Width(&width);
printf("Frame: %d %d\n", height, width);
UINT ncaps = 0;
BYTE* buff = nullptr;
colorf->AccessRawUnderlyingBuffer(&ncaps, &buff); // 获取数据的指针和大小
//depthf->CopyFrameDataToArray(...); // 将数据Copy到制定的buffer中
printf("Buffer size: %d\n", ncaps);
colorf->Release();
frameDs->Release();
Sleep(200);
}
pKinect->Close();
endstop:
system("pause");
return 0;
}
基本数据已经全部获取到了,其他高级功能后面继续讨论。
Kinect V2 开发专题(4)
1、骨骼数据获取
2、深度数据获取
3、红外图像获取
4、摄像头数据获取
1、骨骼数据获取
前面的代码省略,从获取数据开始:[cpp] view plain copy
// 获取身体数据
IBodyFrameSource* bodys = nullptr;
bb->get_BodyFrameSource(&bodys); // Body 数据源
INT32 nBodyNum = 0;
bodys->get_BodyCount(&nBodyNum); // 获取body 个数,没用,一直是6
printf("Body Num: %d\n", nBodyNum);
IBodyFrameReader* bodyr = nullptr;
bodys->OpenReader(&bodyr); // 准备读取body数据
while (true)
{
IBodyFrame* bodyf = nullptr;
bodyr->AcquireLatestFrame(&bodyf); // 获取最近的一帧数据
if ( !bodyf )
{
Sleep(100);
printf(".");
continue;
}
IBody* ppBodies[BODY_COUNT] = { 0 };
bodyf->GetAndRefreshBodyData(BODY_COUNT, ppBodies); // 更新所有人身体数据
for (int i = 0; i < BODY_COUNT; ++i)
{
IBody* pBody = ppBodies[i]; // 轮询每个人的信息
if (pBody)
{
BOOLEAN bTracked = false;
hr = pBody->get_IsTracked(&bTracked); // 检测是否被跟踪,即是否有这个人
if (bTracked)
{
Joint joints[JointType_Count];
HandState leftHandState = HandState_Unknown;
HandState rightHandState = HandState_Unknown;
pBody->get_HandLeftState(&leftHandState); // 获取左手的状态
pBody->get_HandRightState(&rightHandState); // 获取右手的状态
hr = pBody->GetJoints(_countof(joints), joints); // 获取身体的骨骼信息,25点
printf("Person %d : Joints[0].Z %.2f\n", i, joints[0].Position.Z); //简单的输出他的信息
}
}
}
for (int i = 0; i < BODY_COUNT; ++i)
{
ppBodies[i]->Release();
}
bodyf->Release();
}
2、深度数据获取
有了骨骼信息,深度数据就显得没太大的用处了。[cpp] view plain copy
/*
Depth min: 500 max: 4500
Frame: 424 512
Buffer size: 217088
*/
int _tmain(int argc, _TCHAR* argv[])
{
printf("Hello, Wellcome to kinect world!\n");
IKinectSensor* pKinect = nullptr;
GetDefaultKinectSensor(&pKinect);
if ( !pKinect)
{
printf("Get Kinect failed!\n");
goto endstop;
}
pKinect->Open();
BOOLEAN bOpen = false;
// 一直等待直到Kinect打开完成
while (!bOpen)
{
pKinect->get_IsOpen(&bOpen);
Sleep(200);
}
IDepthFrameSource* depths = nullptr;
pKinect->get_DepthFrameSource(&depths); // 获取深度数据源
IDepthFrameReader* depthr = nullptr;
depths->OpenReader(&depthr); // 打开深度解析器
while (true)
{
IDepthFrame* depthf = nullptr;
depthr->AcquireLatestFrame(&depthf); // 获取最近的深度数据
if ( !depthf )
{
Sleep(200);
continue;
}
USHORT minds, maxds;
depthf->get_DepthMinReliableDistance(&minds); // 获取最近的有效距离,500
depthf->get_DepthMaxReliableDistance(&maxds); // 获取最远的有效距离,4500
printf("Depth min: %d max: %d\n", minds, maxds);
IFrameDescription* frameDs = nullptr;
depthf->get_FrameDescription(&frameDs); // 获取深度信息的属性
int height, width;
frameDs->get_Height(&height);
frameDs->get_Width(&width);
printf("Frame: %d %d\n", height, width);
UINT ncaps = 0;
UINT16* buff = nullptr;
depthf->AccessUnderlyingBuffer(&ncaps, &buff); // 获取深度数据的指针和大小
//depthf->CopyFrameDataToArray(...); // 讲深度数据Copy到制定的buffer中
printf("Buffer size: %d\n", ncaps);
depthf->Release();
frameDs->Release();
Sleep(200);
}
pKinect->Close();
endstop:
system("pause");
return 0;
}
3、红外数据获取
Kinect的核心计算就是根据红外数据的,我们也来获取一下看看。其实,它和深度数据没啥区别,真的,大小、用法也一摸一样。[cpp] view plain copy
/*
Frame: 424 512
Buffer size: 217088
*/
int _tmain(int argc, _TCHAR* argv[])
{
printf("Hello, Wellcome to kinect world!\n");
IKinectSensor* pKinect = nullptr;
GetDefaultKinectSensor(&pKinect);
if ( !pKinect)
{
printf("Get Kinect failed!\n");
goto endstop;
}
pKinect->Open();
BOOLEAN bOpen = false;
// 一直等待直到Kinect打开完成
while (!bOpen)
{
pKinect->get_IsOpen(&bOpen);
Sleep(200);
}
IInfraredFrameSource* infrareds = nullptr;
pKinect->get_InfraredFrameSource(&infrareds); // 获取红外数据源
IInfraredFrameReader* infraredr = nullptr;
infrareds->OpenReader(&infraredr); // 打开红外解析器
while (true)
{
IInfraredFrame* infraredf = nullptr;
infraredr->AcquireLatestFrame(&infraredf); // 获取最近的红外数据
if (!infraredf)
{
Sleep(200);
continue;
}
IFrameDescription* frameDs = nullptr;
infraredf->get_FrameDescription(&frameDs); // 获取红外信息的属性
int height, width;
frameDs->get_Height(&height);
frameDs->get_Width(&width);
printf("Frame: %d %d\n", height, width);
UINT ncaps = 0;
UINT16* buff = nullptr;
infraredf->AccessUnderlyingBuffer(&ncaps, &buff); // 获取红外数据的指针和大小
//depthf->CopyFrameDataToArray(...); // 将数据Copy到制定的buffer中
printf("Buffer size: %d\n", ncaps);
infraredf->Release();
frameDs->Release();
Sleep(200);
}
pKinect->Close();
endstop:
system("pause");
return 0;
}
4、摄像头数据获取
摄像头也很简单的,不用看也知道,和上面的差不多。直接上代码了。[cpp] view plain copy
/*
Frame: 1080 1920
Buffer size: 4147200
*/
int _tmain(int argc, _TCHAR* argv[])
{
printf("Hello, Wellcome to kinect world!\n");
IKinectSensor* pKinect = nullptr;
GetDefaultKinectSensor(&pKinect);
if ( !pKinect)
{
printf("Get Kinect failed!\n");
goto endstop;
}
pKinect->Open();
BOOLEAN bOpen = false;
// 一直等待直到Kinect打开完成
while (!bOpen)
{
pKinect->get_IsOpen(&bOpen);
Sleep(200);
}
IColorFrameSource* colorfs = nullptr;
pKinect->get_ColorFrameSource(&colorfs); // 获取图像数据源
IColorFrameReader* colorfr = nullptr;
colorfs->OpenReader(&colorfr); // 打开解析器
while (true)
{
IColorFrame* colorf = nullptr;
colorfr->AcquireLatestFrame(&colorf); // 获取最近的数据
if (!colorf)
{
Sleep(200);
continue;
}
IFrameDescription* frameDs = nullptr;
colorf->get_FrameDescription(&frameDs); // 获取信息的属性
int height, width;
frameDs->get_Height(&height);
frameDs->get_Width(&width);
printf("Frame: %d %d\n", height, width);
UINT ncaps = 0;
BYTE* buff = nullptr;
colorf->AccessRawUnderlyingBuffer(&ncaps, &buff); // 获取数据的指针和大小
//depthf->CopyFrameDataToArray(...); // 将数据Copy到制定的buffer中
printf("Buffer size: %d\n", ncaps);
colorf->Release();
frameDs->Release();
Sleep(200);
}
pKinect->Close();
endstop:
system("pause");
return 0;
}
基本数据已经全部获取到了,其他高级功能后面继续讨论。
相关文章推荐
- Kinect V2 开发专题(4)骨骼/深度/红外/摄像头数据获取
- Kinect for Windows V2和V1对比开发___骨骼数据获取并用OpenCV2.4.10显示
- Kinect for Windows V2和V1对比开发___骨骼数据获取并用OpenCV2.4.10显示
- Kinect for windows 开发入门 九:骨骼数据获取和使用
- 小技巧:用CxImage将从摄像头获取的图像原始数据转成JPG,然后通过DDS发送出去
- InfoPath开发:获取SQL Server中的数据
- Asp.Net 上传大文件专题(3)--从请求流中获取数据并保存为文件[下]
- [转]Asp.Net 上传大文件专题(3)--从请求流中获取数据并保存为文件[上]
- 如何利用Video4Linux获取摄像头数据
- Revit二次开发高级专题讲座:访问Revit模型中的几何数据以及对象间关系判断方法(点击下载)
- 小技巧:用CxImage将从摄像头获取的图像原始数据转成JPG,然
- [连载]3D GIS开发之一:数据的获取
- 如何利用Video4Linux获取摄像头数据
- 合肥公交换乘模块开发实录 -- 获取/处理数据
- 如何利用Video4Linux获取摄像头数据
- Asp.Net 上传大文件专题(3)--从请求流中获取数据并保存为文件[上]
- Asp.Net 上传大文件专题(3)--从请求流中获取数据并保存为文件[上]
- Ajax开发过程中提交获取数据的乱码问题
- InfoPath开发实战(2):获取XML文件中的数据
- 利用Video4Linux获取摄像头数据