kinect2.0开发(一) 读取深度图像

原创 2015年11月19日 17:33:09

代码运行环境

本代码为运行在windows8 64位系统上,采用vs2013集成开发环境,编译为win32程序
利用opencv库显示图像

运行前准备

1.安装Microsoft kinect2.0 SDK
2.配置opencv环境变量
参考以下步骤
http://tanghenxin.blog.163.com/blog/static/213511105201421244826743/
3.将kinect.h的库文件Kinect20.lib包含进去
包含目录: C:\Program Files\Microsoft SDKs\Kinect\v2.0_1409\inc
库目录:C:\Program Files\Microsoft SDKs\Kinect\v2.0_1409\Lib\x86

读取深度图像步骤

  1. 获取kinect传感器
  2. 打开传感器
  3. 获取深度信息传感器
  4. 打开深度帧读取器
  5. 获得最近的一帧
  6. 将深度信息转换为MAT格式
  7. 用opencv的imshow显示
  8. 回收和释放内存

代码如下:

// kinectSensorTest.cpp : 定义控制台应用程序的入口点。
//

#include <stdio.h>
#include <Kinect.h>
#include <windows.h>
#include <highgui.h>
#include <cv.h>

using namespace cv;

// 转换depth图像到cv::Mat
Mat ConvertMat(const UINT16* pBuffer, int nWidth, int nHeight)
{
    Mat img(nHeight, nWidth, CV_8UC1);
    uchar* p_mat = img.data;//指向头指针

    const UINT16* pBufferEnd = pBuffer + (nWidth * nHeight);//指向最后一个元素的指针

    while (pBuffer < pBufferEnd)//16位最大值为65536
    {
        *p_mat++ = *pBuffer++ /65536.0 * 256;
    }
    return img;
}
int main()
{
    IKinectSensor*          m_pKinectSensor;
    IDepthFrameReader*      m_pDepthFrameReader;
    IDepthFrame* pDepthFrame = NULL;
    IFrameDescription* pFrameDescription = NULL;
    IDepthFrameSource* pDepthFrameSource = NULL;

    HRESULT hr = GetDefaultKinectSensor(&m_pKinectSensor);//获取默认kinect传感器
    assert(hr >= 0);
    printf("打开kinect传感器成功\n");

    hr = m_pKinectSensor->Open();//打开传感器
    assert(hr >= 0);
    hr = m_pKinectSensor->get_DepthFrameSource(&pDepthFrameSource);//获得深度信息传感器
    assert(hr >= 0);
    hr = pDepthFrameSource->OpenReader(&m_pDepthFrameReader);//打开深度信息帧读取器
    assert(hr >= 0);

    while (hr < 0 || pDepthFrame == NULL)
        hr = m_pDepthFrameReader->AcquireLatestFrame(&pDepthFrame);//由于有时候获取不到,因此循环获取最近的帧

    assert(hr >= 0);
    hr = pDepthFrame->get_FrameDescription(&pFrameDescription);//获取帧的像素信息(宽和高)
    int depth_width, depth_height;
    pFrameDescription->get_Width(&depth_width);
    pFrameDescription->get_Height(&depth_height);
    printf("width=%d height=%d\n", depth_width, depth_height);

    USHORT nDepthMinReliableDistance = 0;//获取最大、最小深度距离信息
    USHORT nDepthMaxReliableDistance = 0;
    assert(hr >= 0);
    hr = pDepthFrame->get_DepthMinReliableDistance(&nDepthMinReliableDistance);
    assert(hr >= 0);
    hr = pDepthFrame->get_DepthMaxReliableDistance(&nDepthMaxReliableDistance);

    printf("nDepthMinReliableDistance=%d nDepthMaxReliableDistance=%d\n", nDepthMinReliableDistance, nDepthMaxReliableDistance);

    UINT nBufferSize_depth = 0;
    UINT16 *pBuffer_depth = NULL;
    pDepthFrame->AccessUnderlyingBuffer(&nBufferSize_depth, &pBuffer_depth);//获取图像像素个数和指向图像的指针


    //转换为MAT格式
    Mat depthImg_show = ConvertMat(pBuffer_depth, depth_width, depth_height);//转换为8位的mat


    equalizeHist(depthImg_show, depthImg_show);//均衡化,为了提高显示效果

    imwrite("MyFirstKinectImg.jpg", depthImg_show);//保存图片
    //用opencv显示

    namedWindow("display");

    imshow("display", depthImg_show);

    if (27 == waitKey(0))
    return 0;
}

实验结果如图:
这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

深度图像的获取原理

在计算机视觉系统中,三维场景信息为图像分割、目标检测、物体跟踪等各类计算机视觉应用提供了更多的可能性,而深度图像(Depth map)作为一种普遍的三维场景信息表达方式得到了广泛的应用。深度图像的每个...
  • u012017783
  • u012017783
  • 2017年04月09日 19:55
  • 8655

Kinect开发教程二:OpenNI读取深度图像与彩色图像并显示

细心的朋友肯定已经发现Kinect上长了三只眼睛,其中一个是彩色摄像头,另外两个深度摄像头,一个负责发射红外光,一个负责接收,这样,我们便能通过Kinect得到一幅彩色图像和一幅深度图像。如果大家对K...
  • chenxin_130
  • chenxin_130
  • 2011年08月17日 20:40
  • 46707

Kinect v2.0原理介绍之四:人脸跟踪探讨

kinect人脸检测的原理
  • u014365862
  • u014365862
  • 2015年07月12日 12:27
  • 4002

Kinect for Windows SDK v2.0 开发笔记 (一)环境

嗯,它来了,Windows for Windows v2。 7
  • dustpg
  • dustpg
  • 2014年07月20日 05:56
  • 16908

kinect1获取深度图像

#include #include #include #include using namespace std; using namespace cv;int main(int argc, c...
  • qq_25254777
  • qq_25254777
  • 2017年11月29日 16:23
  • 117

Kinect v2深度测量原理

【翻译】Kinect v2程序设计(C++) Depth编 Kinect SDK v2预览版,取得Depth数据的方法说明。 上一节,介绍了通过使用Kinect for Windows SDK...
  • ppp2006
  • ppp2006
  • 2016年04月19日 11:19
  • 9189

Kinect for Windows V2.0 新特性

外观:        第二代Kinect for Windows看起来与Kinect for Xbox One相同,用以区别的是Windows版Kinect顶部写着Kinect,Xbox版只有一...
  • glb562000520
  • glb562000520
  • 2014年07月07日 16:29
  • 5698

Kinect2.0+VS2013 试玩

kinect+VS2013试玩
  • snowbird13
  • snowbird13
  • 2014年12月15日 11:08
  • 2834

Kinect深度图与彩色图的坐标校准

kinect的深度数据和彩色数据的分辨率以及视场大小都不一样,不能直接对应起来,想要把深度和彩色融合起来就要费一番周折了。 看了MSDN中kinectSDK的介绍,发现了一个ICoordinateM...
  • shihz_fy
  • shihz_fy
  • 2015年02月07日 12:21
  • 12560

Kinect v2.0原理介绍之六:Kinect深度图与彩色图的坐标校准

~~有兴趣的加kinect算法交流群:462964980 kinect的深度数据和彩色数据的分辨率以及视场大小都不一样,不能直接对应起来,想要把深度和彩色融合起来就要费一番周折了。 看了MSDN中...
  • u014365862
  • u014365862
  • 2015年09月04日 19:40
  • 4772
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:kinect2.0开发(一) 读取深度图像
举报原因:
原因补充:

(最多只允许输入30个字)