简介
Kinect for Windows V2
彩色图像:19201080 @30、15FPS(根据环境亮度)
深度图像:512424 @ 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)来获取最新的深度数据。