kinect 2.0 SDK学习笔记(一)--获得原始数据
来源:互联网 发布:淘宝上目前最贵的东西 编辑:程序博客网 时间:2024/05/29 18:02
工程配置
包含目录加上: $(KINECTSDK20_DIR)\inc;
库目录加上: $(KINECTSDK20_DIR)\lib\x64;
(注意选择x64/x86)
其中KINECTSDK20_DIR是安装kinect SDK时的安装目录,比如我的是
C:\Program Files\Microsoft SDKs\Kinect\v2.0_1409\
六种数据源
Kinect Data Sources – 6种数据源
1. ColorFrameSource
彩色图
2. InfraredFrameSource
红外图(16-bit)
3. DepthFrameSource
深度图(16-bit,单位:mm)
kinect采的深度数据是short型,即每个像素深度占2个字节,但是16位中只有12位是有用的,2^12 = 4096,单位是毫米,所以范围是4m
4. BodyIndexFrameSource
人物索引图(用一个字节代表人体,最多支持6个人体)
5. BodyFrameSource
人体关节图
6. AudioSource
声音
流程
Kinect v2中获取并处理数据源接口步骤如下:
Sensor -> Source -> Reader -> Frame -> Data
- 单数据源的获取:
1. 获取kinect
IKinectSensor* m_pKinectSensor; HRESULT hr;hr = GetDefaultKinectSensor(&m_pKinectSensor);hr = m_pKinectSensor->Open();
- 显示数据源的源数据并为阅读器(readers)提供途径、为传感器每个数据提供一种数据源。
hr = m_pKinectSensor->get_ColorFrameSource(&pColorFrameSource);
- 提供获取帧的途径(事件机制、轮询机制)。
hr = pColorFrameSource->OpenReader(&m_pColorFrameReader);
- 发送帧事件参数,获取最近一帧的数据。
hr = m_pColorFrameReader->AcquireLatestFrame(&pColorFrame);
- 多数据源获取:
- 与上面的1.相同
- 获取多数据源到读取器
IMultiSourceFrameReader* m_pMultiFrameReader;hr = m_pKinectSensor->OpenMultiSourceFrameReader( FrameSourceTypes::FrameSourceTypes_Color | FrameSourceTypes::FrameSourceTypes_Infrared | FrameSourceTypes::FrameSourceTypes_Depth, &m_pMultiFrameReader);
- 获取多源数据帧
hr = m_pMultiFrameReader->AcquireLatestFrame(&m_pMultiFrame);
- 从多源数据帧中分离出各个数据源
hr = m_pMultiFrame->get_ColorFrameReference(&m_pColorFrameReference);hr = m_pColorFrameReference->AcquireFrame(&m_pColorFrame);
两种方式最后都能获得你想要的数据帧,并对其进行操作
例子
- opencv显示原始的彩色,深度,红外数据
#include "kinect.h"#include <iostream>#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv;using namespace std;// 安全释放指针template<class Interface>inline void SafeRelease(Interface *& pInterfaceToRelease){ if (pInterfaceToRelease != NULL) { pInterfaceToRelease->Release(); pInterfaceToRelease = NULL; }}int main(){ // 获取Kinect设备 IKinectSensor* m_pKinectSensor; HRESULT hr; hr = GetDefaultKinectSensor(&m_pKinectSensor); if (FAILED(hr)) { return hr; } IMultiSourceFrameReader* m_pMultiFrameReader; if (m_pKinectSensor) { hr = m_pKinectSensor->Open(); if (SUCCEEDED(hr)) { // 获取多数据源到读取器 hr = m_pKinectSensor->OpenMultiSourceFrameReader( FrameSourceTypes::FrameSourceTypes_Color | FrameSourceTypes::FrameSourceTypes_Infrared | FrameSourceTypes::FrameSourceTypes_Depth, &m_pMultiFrameReader); } } if (!m_pKinectSensor || FAILED(hr)) { return E_FAIL; } // 三个数据帧及引用 IDepthFrameReference* m_pDepthFrameReference; IColorFrameReference* m_pColorFrameReference; IInfraredFrameReference* m_pInfraredFrameReference; IInfraredFrame* m_pInfraredFrame; IDepthFrame* m_pDepthFrame; IColorFrame* m_pColorFrame; // 三个图片格式 Mat i_rgb(1080 , 1920, CV_8UC4); //注意:这里必须为4通道的图,Kinect的数据只能以Bgra格式传出 Mat i_depth(424, 512, CV_8UC1); Mat i_ir(424, 512, CV_16UC1); UINT16 *depthData = new UINT16[424*512]; IMultiSourceFrame* m_pMultiFrame = nullptr; while (true) { // 获取新的一个多源数据帧 hr = m_pMultiFrameReader->AcquireLatestFrame(&m_pMultiFrame); if (FAILED(hr)||!m_pMultiFrame) { //cout << "!!!" << endl; continue; } // 从多源数据帧中分离出彩色数据,深度数据和红外数据 if (SUCCEEDED(hr)) hr = m_pMultiFrame->get_ColorFrameReference(&m_pColorFrameReference); if (SUCCEEDED(hr)) hr = m_pColorFrameReference->AcquireFrame(&m_pColorFrame); if (SUCCEEDED(hr)) hr = m_pMultiFrame->get_DepthFrameReference(&m_pDepthFrameReference); if (SUCCEEDED(hr)) hr = m_pDepthFrameReference->AcquireFrame(&m_pDepthFrame); if (SUCCEEDED(hr)) hr = m_pMultiFrame->get_InfraredFrameReference(&m_pInfraredFrameReference); if (SUCCEEDED(hr)) hr = m_pInfraredFrameReference->AcquireFrame(&m_pInfraredFrame); // color拷贝到图片中 UINT nColorBufferSize = 1920 * 1080 * 4; if (SUCCEEDED(hr)) hr = m_pColorFrame->CopyConvertedFrameDataToArray(nColorBufferSize, reinterpret_cast<BYTE*>(i_rgb.data), ColorImageFormat::ColorImageFormat_Bgra); // depth拷贝到图片中 if (SUCCEEDED(hr)) { hr = m_pDepthFrame->CopyFrameDataToArray(424 * 512, depthData); for (int i = 0; i < 512*424; i++) { // 0-255深度图,为了显示明显,只取深度数据的低8位 BYTE intensity = static_cast<BYTE>(depthData[i] % 256); reinterpret_cast<BYTE*>(i_depth.data)[i] = intensity; } // 实际是16位unsigned int数据 //hr = m_pDepthFrame->CopyFrameDataToArray(424 * 512, reinterpret_cast<UINT16*>(i_depth.data)); } // infrared拷贝到图片中 if (SUCCEEDED(hr)) { hr = m_pInfraredFrame->CopyFrameDataToArray(424 * 512, reinterpret_cast<UINT16*>(i_ir.data)); } // 显示 imshow("rgb", i_rgb); if (waitKey(1) == VK_ESCAPE) break; imshow("depth", i_depth); if (waitKey(1) == VK_ESCAPE) break; imshow("ir", i_ir); if (waitKey(1) == VK_ESCAPE) break; // 释放资源 SafeRelease(m_pColorFrame); SafeRelease(m_pDepthFrame); SafeRelease(m_pInfraredFrame); SafeRelease(m_pColorFrameReference); SafeRelease(m_pDepthFrameReference); SafeRelease(m_pInfraredFrameReference); SafeRelease(m_pMultiFrame); } // 关闭窗口,设备 cv::destroyAllWindows(); m_pKinectSensor->Close(); std::system("pause"); return 0;}
0 0
- kinect 2.0 SDK学习笔记(一)--获得原始数据
- kinect 2.0 SDK学习笔记(二)--坐标映射
- kinect 学习笔记一
- kinect 学习笔记一
- kinect 2.0 SDK学习笔记(七)--matlab自带相机标定程序对kinect进行简单标定
- kinect学习笔记三(SDK精确度矫正)
- C# Kinect 2.0 SDK 学习笔记(0)——基本情况介绍
- C# Kinect 2.0 SDK 学习笔记(1)——彩色影像数据流
- kinect 2.0 SDK学习笔记(三)--生成3D点云
- kinect 2.0 SDK学习笔记(四)--深度图与彩色图对齐
- Kinect学习笔记一ColorFrame
- Kinect for Windows SDK 开发(一)
- Kinect开发学习笔记之(一)Kinect介绍和应用
- Kinect开发学习笔记之(一)Kinect介绍和应用 (转)
- Kinect开发学习笔记之(一)Kinect介绍和应用
- Kinect开发学习笔记之(一)Kinect介绍和应用
- Kinect开发学习笔记之(一)Kinect介绍和应用开发实例
- Kinect开发学习笔记之(一)Kinect介绍和应用
- Ubuntu 的apt-get install的安装错误
- 三年日记-------------记录每天的工作与思考。
- os上安装jdk1.7
- Codeforces 401A Vanya and Card【贪心】水题
- linux signals
- kinect 2.0 SDK学习笔记(一)--获得原始数据
- MYSQL数据库——DML语句
- C++ vector 的相关基本操作
- 图片大小批量处理代码(MATLAB)
- Maxima符号计算系统简介
- Mac OS上配置Maven
- onvif规范 中文介绍
- Python 装饰器一说
- Java类型