Kinect V2学习笔记

简介
Kinect for Windows V2

在这里插入图片描述
彩色图像:19201080 @30、15FPS(根据环境亮度)
深度图像:512
424 @ 30FPS、16bit距离值(mm)、可侦测范围0.5~8m红外图像:512*424 @ 30FPS、16bit强度值
声音:根据以上数据,可以再通过软件,进行人体的追踪。骨架的辨识(0.5~4.5m)。最多6个人,每个人25个关节点,其中每个关节点可以取得空间中的位置、方向等数据。 麦克风阵列可判断声音的来源,搭配Microsoft Speech SDK,可分析声音的输入,做语音控制。
在这里插入图片描述

环境配置

环境:Windows10+VS2017+Kinect V2.0+OpenCV3.4.6
OpenCV配置见以前的文档。
安装软件:KinectSDK-v2.0_1409-Setup.exe
https://dwz.cn/aSSKhBFr

VS中配置
和OpenCV中配置类似,先进去属性
VC++目录->包含目录填:C:\Program Files\Microsoft SDKs\Kinect\v2.0_1409\inc
VC++目录->库目录填:C:\Program Files\Microsoft SDKs\Kinect\v2.0_1409\Lib\x64
(具体路径由自己安装路径决定)
在这里插入图片描述
在这里插入图片描述
链接器->输入->附加依赖项填:Kinect20.lib

在这里插入图片描述
概述

由于 K4W SDK v2 在概念上是采取面向对象的设计,所以其他的操作,都是要透过「接口」(Interface) 的类别来做操作,像是前面例子里面、对应到传感器实体的 IKinectSensor 就是一个 interface;而 如同前面提过的,这类的类别在 SDK 里面,都统一是大写「I」开。
使用的流程基本是polling(轮询)模式:
取得传感器(sensor)->取得数据源(data source)->开启数据画面读取器(frame reader)->进入主循环->透过读取器取得数据画面(frame)。
在数据源的部分来说,以C++的API来看,包括了深度影像(depth frame)、彩色影像(color frame)、红外线影像(infrared frame)、长时间曝光红外线影像(long exposure infrared frame)、声音(audio)、身体(body frame)、身体索引(body index frame);这些不同的来源,都有对应的frame reader 和 frame 的定义。

第一个程序(传感器中心点的深度)

// Standard Library(头文件)
#include <iostream>
#include <opencv.hpp>
// Kinect for Windows SDK Header
#include <Kinect.h>

using namespace cv;
using namespace std;

int main()
{
	IKinectSensor *pSensor = nullptr;//换一个简单一点的理解方式,定义一个IKinectSensor类,pSensor就是给传感器取的一个名字
	GetDefaultKinectSensor(&pSensor);//GetDefaultKinectSensor是取得默认传感器,门
	pSensor->Open();//开启传感器,开门


	IDepthFrameSource *pFrameSource = nullptr;//定义一个IDepthFrameSource类,pFrameSource就是给深度图像取的一个名字
	pSensor->get_DepthFrameSource(&pFrameSource);//从pSensor传感器中得到深度图像来源传到pFrameSource中,门的地址


	IDepthFrameReader *pFrameReader = nullptr;
	pFrameSource->OpenReader(&pFrameReader);//同上,将pFrameSource的值传到pFrameReader,从门的地址中得到信息的接口


	//size_t uFrameCount = 0;
	while (1)//进入循环
	{

		double time0 = static_cast<double>(getTickCount());//记录起始时间

		// 4a. Get last frame
		IDepthFrame *pFrame = nullptr;
		if (pFrameReader->AcquireLatestFrame(&pFrame) == S_OK)//通过接口来取得信息
		{
			//尝试把这个放到循环外面
			int iWidth = 0;
			int iHeight = 0;
			IFrameDescription *pFrameDescription = nullptr;//IFrameDescription类,可以读取里面包含的画面的基本信息(高、宽、像素的大小等等)
			pFrame->get_FrameDescription(&pFrameDescription);//从pFrame中取得信息传给pFrameDescription
			pFrameDescription->get_Width(&iWidth);//取得宽度
			pFrameDescription->get_Height(&iHeight);//取得高度
			pFrameDescription->Release();//用完就释放
			pFrameDescription = nullptr;//指向空


			UINT uBufferSize = 0;//UINT类型在WINDOWS API中有定义,它对应于32位无符号整数
			UINT16 *pBuffer = nullptr;
			pFrame->AccessUnderlyingBuffer(&uBufferSize, &pBuffer);
			//AccessUnderlyingBuffer类,可以取得画面数据的指针(pBuffer)、以及数据数组的大小(iBufferSize)
			//pBuffer 是一个UINT16的指标,他所指到的数组、就是整张图的数据了


			int x = iWidth / 2,
				y = iHeight / 2;//这个换算是怎么来的?
			size_t idx = x + iWidth * y;
			std::cout << pBuffer[idx] << std::endl;

			//小玩意
			if (pBuffer[idx] < 600)
			{
				system("color 4F");
			}
			else { system("color 0F"); }//距离低于一定的时候改变窗口颜色


			// 4e. release frame
			pFrame->Release();
			pFrame = nullptr;
			//++uFrameCount;
		}
		else
		{
			cout << "出错" << endl;
			//break;
		}
		time0 = ((double)getTickCount() - time0) / getTickFrequency();
		cout << "运行时间为:" << time0 << "秒" << endl;

	}
	waitKey(1000000);

	// 3b. release frame reader
	pFrameReader->Release();
	pFrameReader = nullptr;
	// 2b. release Frame source
	pFrameSource->Release();
	pFrameSource = nullptr;
	// 1c. Close Sensor
	pSensor->Close();
	// 1d. Release Sensor
	pSensor->Release();
	pSensor = nullptr;
	return 0;
}

效果图
距离大于600
在这里插入图片描述
距离小于600
在这里插入图片描述
相关说明
1、距离小于500后就直接变为0了,有效距离为0.5米到4.5米左右。
2、主要是对下面的理解
IKinectSensor *pSensor = nullptr;//换一个简单一点的理解方式,定义一个IKinectSensor类,pSensor就是给传感器取的一个名字
GetDefaultKinectSensor(&pSensor);//GetDefaultKinectSensor是取得默认传感器,门
pSensor->Open();//开启传感器,开门

IDepthFrameSource *pFrameSource = nullptr;//定义一个IDepthFrameSource类,pFrameSource就是给深度图像取的一个名字
pSensor->get_DepthFrameSource(&pFrameSource);//从pSensor传感器中得到深度图像来源传到pFrameSource中,门的地址

IDepthFrameReader *pFrameReader = nullptr;
pFrameSource->OpenReader(&pFrameReader);//同上,将pFrameSource的值传到pFrameReader,从门的地址中得到信息的接口

3、通过pFrameReader->AcquireLatestFrame(&pFrame)来获取最新的深度数据。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值