V1彩色分辨率:640x480

V2彩色分辨率:1920x1080

1,打开彩色图像帧的方式

对于V1: 使用NuiImageStreamOpen方法打开

  1. hr = m_PNuiSensor->NuiImageStreamOpen(

  2. NUI_IMAGE_TYPE_COLOR,NUI_IMAGE_RESOLUTION_640x480,0, 2,

  3. m_hNextColorFrameEvent,&m_hColorStreamHandle);

  4. if( FAILED( hr ) )

  5. {

  6. cout<<"Could notopen image stream video"<<endl;

  7. return hr;

  8. }

  9. 这种方式可以设置分辨率

对于V2:

  1. 首先使用 m_pKinectSensor->Open();//打开Kinect

  2. if (SUCCEEDED(hr))

  3. {

  4. hr =m_pKinectSensor->get_ColorFrameSource(&pColorFrameSource);

  5. }

  6. 方法get_ColorFrameSource打开彩色帧的源。

  7. 然后使用 if (SUCCEEDED(hr))

  8. {

  9. hr =pColorFrameSource->OpenReader(&m_pColorFrameReader);

  10. }

  11. SafeRelease(pColorFrameSource);

  12. 方法OpenReader打开彩色帧读取器。

2,更新彩色帧的方式

对于V1:使用NuiImageStreamGetNextFrame方法

NuiImageStreamGetNextFrame(m_hColorStreamHandle,0, &pImageFrame);//得到该帧数据

对于V2:使用AcquireLatestFrame方法

  1. if (!m_pColorFrameReader)

  2. {

  3. return;

  4. }

  5. IColorFrame* pColorFrame = NULL;

  6. HRESULT hr =m_pColorFrameReader->AcquireLatestFrame(&pColorFrame);

3,数据的处理方式

对于V1:这种数据获取方式比较明朗看到数据内部结构,

  1. INuiFrameTexture *pTexture =pImageFrame->pFrameTexture;

  2. NUI_LOCKED_RECT LockedRect;

  3. pTexture->LockRect(0, &LockedRect,NULL, 0);//提取数据帧到LockedRect,它包括两个数据对象:pitch每行字节数,pBits第一个字节地址

  4. if( LockedRect.Pitch != 0 )

  5. {

  6. cvZero(colorImage);

  7. for (int i=0; i<480; i++)

  8. {

  9. uchar* ptr =(uchar*)(colorImage->imageData+i*colorImage->widthStep);

  10. BYTE * pBuffer =(BYTE*)(LockedRect.pBits)+i*LockedRect.Pitch;//每个字节代表一个颜色信息,直接使用BYTE

  11. for (int j=0; j<640; j++)

  12. {

  13. ptr[3*j] =pBuffer[4*j];//内部数据是4个字节,0-1-2是BGR,第4个现在未使用

  14. ptr[3*j+1] =pBuffer[4*j+1];

  15. ptr[3*j+2] =pBuffer[4*j+2];

  16. }

  17. }

  18. //cvWriteFrame(wr_color,colorImage);

  19. cvShowImage("colorImage", colorImage);//显示图像

得到的最终形式可以用OpenCV显示。

对于V2:   这种数据的内部结构是神马样子呢?然后如何用OpenCV显示出图像数据呢?待查…

  1. RGBQUAD* m_pColorRGBX;//彩色数据存储位置

  2. m_pColorRGBX(NULL)//构造函数初始化

  3. // create heap storage for color pixel data in RGBXformat

  4. m_pColorRGBX = new RGBQUAD[cColorWidth *cColorHeight];

  5. //下边就是AcquireLatestFrame之后处理数据

  6. INT64 nTime = 0;

  7. IFrameDescription* pFrameDescription =NULL;

  8. int nWidth = 0;

  9. int nHeight = 0;

  10. ColorImageFormat imageFormat = ColorImageFormat_None;

  11. UINT nBufferSize = 0;

  12. RGBQUAD *pBuffer = NULL;

  13. if (SUCCEEDED(hr))

  14. {

  15. if (imageFormat == ColorImageFormat_Bgra)

  16. {

  17. hr =pColorFrame->AccessRawUnderlyingBuffer(&nBufferSize, reinterpret_cast<BYTE**>(&pBuffer));

  18. }

  19. else if (m_pColorRGBX)

  20. {

  21. pBuffer = m_pColorRGBX;

  22. nBufferSize = cColorWidth *cColorHeight * sizeof(RGBQUAD);

  23. hr = pColorFrame->CopyConvertedFrameDataToArray(nBufferSize,reinterpret_cast<BYTE*>(pBuffer), ColorImageFormat_Bgra);

  24. }

  25. else

  26. {

  27. hr = E_FAIL;

  28. }

  29. }

  30. if (SUCCEEDED(hr))

  31. {

  32. ProcessColor(nTime, pBuffer,nWidth, nHeight);

  33. }

感觉目前得到的pBuffer就是存储的彩色数据,问题是如何用OpenCV来显示呢?

4,OpenCV显示

  1. <span style="white-space:pre"> </span>int width = 0;

  2. int height = 0;

  3. pDescription->get_Width( &width ); // 1920

  4. pDescription->get_Height( &height ); // 1080

  5. unsigned int bufferSize = width * height * 4 * sizeof( unsigned char );

  6. //创建尺寸为height x width 的4通道8位图像

  7. Mat bufferMat( height, width, CV_8UC4 );

  8. Mat colorMat( height / 2, width / 2, CV_8UC4 );

  9. while( 1 ){

  10. // 更新彩色帧

  11. IColorFrame* pColorFrame = nullptr;

  12. hResult = pColorReader->AcquireLatestFrame( &pColorFrame );

  13. if( SUCCEEDED( hResult ) ){

  14. hResult = pColorFrame->CopyConvertedFrameDataToArray( bufferSize, reinterpret_cast<BYTE*>( bufferMat.data ), ColorImageFormat::ColorImageFormat_Bgra );

  15. if( SUCCEEDED( hResult ) ){

  16. resize( bufferMat, colorMat, cv::Size(), 0.5, 0.5 );

  17. }

  18. }

  19. SafeRelease( pColorFrame );

  20. imshow( "Color", colorMat );

其中用到kinect的CopyConvertedFrameDataToArray函数,将图像帧转换为矩阵数据用来显示。

5,V2+VS2012+OpenCV代码

  1. #include <Windows.h>

  2. #include <Kinect.h>

  3. #include <opencv2/opencv.hpp>

  4. using namespace std;

  5. using namespace cv;

  6. //释放接口需要自己定义

  7. template<class Interface>

  8. inline void SafeRelease( Interface *& pInterfaceToRelease )

  9. {

  10. if( pInterfaceToRelease != NULL ){

  11. pInterfaceToRelease->Release();

  12. pInterfaceToRelease = NULL;

  13. }

  14. }

  15. int main( int argc, char **argv[] )

  16. {

  17. //OpenCV中开启CPU的硬件指令优化功能函数

  18. setUseOptimized( true );

  19. // 打开kinect

  20. IKinectSensor* pSensor;

  21. HRESULT hResult = S_OK;

  22. hResult = GetDefaultKinectSensor( &pSensor );

  23. if( FAILED( hResult ) ){

  24. cerr << "Error : GetDefaultKinectSensor" << std::endl;

  25. return -1;

  26. }

  27. hResult = pSensor->Open();

  28. if( FAILED( hResult ) ){

  29. cerr << "Error : IKinectSensor::Open()" << std::endl;

  30. return -1;

  31. }

  32. // 彩色帧源

  33. IColorFrameSource* pColorSource;

  34. hResult = pSensor->get_ColorFrameSource( &pColorSource );

  35. if( FAILED( hResult ) ){

  36. cerr << "Error : IKinectSensor::get_ColorFrameSource()" << std::endl;

  37. return -1;

  38. }

  39. //彩色帧读取

  40. IColorFrameReader* pColorReader;

  41. hResult = pColorSource->OpenReader( &pColorReader );

  42. if( FAILED( hResult ) ){

  43. cerr << "Error : IColorFrameSource::OpenReader()" << std::endl;

  44. return -1;

  45. }

  46. // Description

  47. IFrameDescription* pDescription;

  48. hResult = pColorSource->get_FrameDescription( &pDescription );

  49. if( FAILED( hResult ) ){

  50. cerr << "Error : IColorFrameSource::get_FrameDescription()" << std::endl;

  51. return -1;

  52. }

  53. int width = 0;

  54. int height = 0;

  55. pDescription->get_Width( &width ); // 1920

  56. pDescription->get_Height( &height ); // 1080

  57. unsigned int bufferSize = width * height * 4 * sizeof( unsigned char );

  58. //创建尺寸为height x width 的4通道8位图像

  59. Mat bufferMat( height, width, CV_8UC4 );

  60. Mat colorMat( height / 2, width / 2, CV_8UC4 );

  61. while( 1 ){

  62. // 更新彩色帧

  63. IColorFrame* pColorFrame = nullptr;

  64. hResult = pColorReader->AcquireLatestFrame( &pColorFrame );

  65. if( SUCCEEDED( hResult ) ){

  66. hResult = pColorFrame->CopyConvertedFrameDataToArray( bufferSize, reinterpret_cast<BYTE*>( bufferMat.data ), ColorImageFormat::ColorImageFormat_Bgra );

  67. if( SUCCEEDED( hResult ) ){

  68. resize( bufferMat, colorMat, cv::Size(), 0.5, 0.5 );

  69. }

  70. }

  71. SafeRelease( pColorFrame );

  72. imshow( "Color", colorMat );

  73. if( waitKey( 30 ) == VK_ESCAPE ){

  74. break;

  75. }

  76. }

  77. SafeRelease( pColorSource );

  78. SafeRelease( pColorReader );

  79. SafeRelease( pDescription );

  80. if( pSensor ){

  81. pSensor->Close();

  82. }

  83. SafeRelease( pSensor );

  84. return 0;

  85. }

分辨率是大大的提高了啊~~

Kinect for Windows V2和V1对比开发___彩色数据获取并用OpenCV2.4.10显示相关推荐

  1. Kinect for Windows v2.0安装教程

    Kinect for Windows v2.0安装教程 根据官方教程,Kinect v2.0支持Windows 8/8.1/10,本教程讲述在Windows 10上的安装. 打开浏览器,百度搜索--K ...

  2. Kinect For Windows V2开发日志一:开发环境的配置

    算是正式进军Kinect了,前段时间学的东西现在就忘了,于是从此开始记录一下. 目前为止大部分的学习资料来自于Heresy的博客,写的非常优秀,清晰明了,十分感谢.开发语言为C++,应该会一直使用,但 ...

  3. Kinect For Windows V2开发日志九:侦测并绘制人体骨架

    简介 在上一篇<侦测.追踪人体骨架>里,介绍了关节点的使用办法,这一篇记录将关节点与OpenCV结合的绘图方法. 代码 #include <iostream> #include ...

  4. Kinect for Windows V2 SDK+ VS2012 环境搭建

    眼下使用的SDK版本号是KinectSDK-v2.0-PublicPreview1409-Setup.exe. 下载地址:http://www.microsoft.com/en-us/download ...

  5. Kinect开发笔记之二Kinect for Windows 2.0新特性

    这是本博客的第一篇翻译文档,笔者已经苦逼的竭尽全力的在翻译了,但无奈英语水平也是很有限,不对或者不妥当不准确的地方必然会有,还恳请大家留言或者邮件我以批评指正,我会虚心接受.谢谢大家.         ...

  6. 搭建kinect for windows开发平台

    网上有很多教程很繁琐,让人感觉搭建kinect开发环境特别麻烦,其实根本没那么复杂,下面给出最简洁的过程, 几步完成环境搭建. 首先,RT,你起码得是windows,而且只能是Win 7及以上. 内存 ...

  7. MachineLN博客目录

    MachineLN博客目录 https://blog.csdn.net/u014365862/article/details/78422372 本文为博主原创文章,未经博主允许不得转载.有问题可以加微 ...

  8. Kinect for Windows SDK v2.0 开发笔记 (十) 高清面部帧(1) FACS 介绍

    转载于:https://blog.csdn.net/dustpg/article/details/38892783 使用SDK: Kinect for Windows SDK v2.0 public ...

  9. Kinect for Windows SDK v2.0 开发笔记 (十三) 高清面部帧(4) 面部模型构建器

     (转载请注明出处) 使用SDK: Kinect for Windows SDK v2.0 public preview1409 同前面,因为SDK未完成,不附上函数/方法/接口的超链接. 这次让 ...

最新文章

  1. 【SDCC 2016·杭州站】9月22日大数据实战专场精彩呈现
  2. STM32 电机教程 26 - ST MCLIB实战之增量式编码器位置传感FOC方案
  3. MAVEN版本依赖的原则及scope
  4. Spark _21 _SparkSQL介绍
  5. ATcoder-[AGC048B]Bracket Score【结论,贪心】
  6. 【2019牛客暑期多校训练营(第一场) - A】Equivalent Prefixes(单调栈,tricks)
  7. 大龄屌丝自学笔记--Java零基础到菜鸟--036
  8. vscode如何添加头部注释、作者注释
  9. [过年菜谱之]红烧甲鱼
  10. 反转!物联网火爆,程序员开发技能却有待加强?
  11. 火速拿来用!对比近 10,000 个 Python 开源项目发现最实用的 TOP34!
  12. 三次样条插值算法C++实现
  13. java docx4j 目录,docx4j项目(包括jar包、javadoc文档、源码及示例)
  14. 多元线性回归分析spss结果解读_spss多元线性回归结果解读
  15. 网页audio标签中autoplay自动播放音乐失败解决方案
  16. C# Dictionary源码解析
  17. Kaggle所有量化金融竞赛汇总。
  18. android avm灰色,APICloud AVM多端开发案例深度解析(上)--点餐app开发
  19. 软件测试工程师的工资有多高?
  20. 2017中国软件技术大会圆满闭幕

热门文章

  1. delphi控件切图界面闪烁_先本设计教你跳过UI小程序的七个坑
  2. Scrum Master
  3. Python 自带的 any() 函数--判断给定的可迭代参数 iterable 是否全部为 False
  4. 解决IE8 无法使用 JS 中Array() 的 indexOf 方法
  5. MUI 列表组件:文字居左中右(排版) - 代码篇
  6. macos安装盘第三方工具制作_简单制作OSXYosemite10.10正式版U盘USB启动安装盘方法教程(全新安装Mac系统)下载|异次元软件世界...
  7. bootstrap登录表单
  8. phpSysInfo监测服务器
  9. axios vue 回调函数_VUE使用axios调用后台API接口的方法
  10. 查询加索引oracle,指定索引/*+INDEX(TABLE INDEX_NAME)*/等优化Oracle查询效率的总结