您的位置:首页 > 其它

Kinect V2 开发专题(4)骨骼/深度/红外/摄像头数据获取

2015-04-03 16:45 288 查看



Kinect V2 开发专题(4)

1、骨骼数据获取
2、深度数据获取
3、红外图像获取
4、摄像头数据获取



1、骨骼数据获取

前面的代码省略,从获取数据开始:

// 获取身体数据
	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、深度数据获取

有了骨骼信息,深度数据就显得没太大的用处了。

/*
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的核心计算就是根据红外数据的,我们也来获取一下看看。其实,它和深度数据没啥区别,真的,大小、用法也一摸一样。
/*
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、摄像头数据获取

摄像头也很简单的,不用看也知道,和上面的差不多。直接上代码了。

/*
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;
}


基本数据已经全部获取到了,其他高级功能后面继续讨论。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: