市场上各种深度摄像头测试之Kinect V2

433人阅读 评论(0) 收藏 举报
分类:

系统要求、系统配置、开发环境

处理器:支持64位(x64)高主频的处理器 建议:AMD羿龙 X4及以上或intel i3及更快的处理器

内存:4 GB DDR 3 1600MHZ 及更大的内存 建议:8G DDR 3 1600MHZ

USB接口: 内置USB 3.0总线 注意!3.0(U口为蓝色,若不是,可买扩展卡,前提是你的机子必须有PCI-E插槽,否则买新机)

显卡:NVIDIA AMD支持DX11的显卡皆可 win8、8.1建议使用支持Direct X11的显卡 win10建议使用支持Direct X12的显卡

os:windows 8、8.1及更高版本的windows 建议使用:windows 8.1 pro (注意:windows 7不支持)

sdk下载安装及运行官方demo

  • Windows安装步骤:

    Kinect for Windows 2.0下载地址:
    https://www.microsoft.com/en-us/download/details.aspx?id=44561

    1、安装 KinectSDK-v2.0_1409-Setup.exe,默认安装即可

    2、开始菜单可看到安装后的文件夹,点击SDK Browser v2.0 (Kinect for Windows)可进入官方 demo进行调试摄像头


深度图像获取

windows+vs2013+opencv 保存16位深度图像,格式为png
1、opencv安装+vs2013配置
直接官网下载:http://opencv.org/
安装和配置:http://blog.csdn.net/wzw_ice/article/details/77159741
2、vs项目配置Kinect V2
(1)右键项目,进入项目属性页,选择Debug配置
(2)VC++目录:
包含目录中 添加官方驱动的include文件夹,如:
C:\Program Files\Microsoft SDKs\Kinect\v2.0_1409\inc
库目录中 添加依赖库,如:
C:\Program Files\Microsoft SDKs\Kinect\v2.0_1409\Lib\x86
(3)链接器->输入->附加依赖项,添加
kinect20.lib
3 个人项目代码(从官方demo提取出来并通过opencv获取深度图像保存为16bit的png)
opencvKinectV2.cpp

#include <windows.h>
#include <Kinect.h>     //Kinect的头文件
#include <iostream>
#include <opencv2/opencv.hpp>           //opencv头文件

using   namespace   std;
using   namespace   cv;


void depth2color(cv::Mat & color, const cv::Mat & depth, const double max, const double min)
{
    cv::Mat grayImage;
    double alpha = 255.0 / (max - min);
    depth.convertTo(grayImage, CV_8UC1, alpha, -alpha * min);// expand your range to 0..255. Similar to histEq();
    cv::applyColorMap(grayImage, color, cv::COLORMAP_JET);// this is great. It converts your grayscale image into a tone-mapped one, much more pleasing for the eye function is found in contrib module, so include contrib.hpp  and link accordingly
}

int main(void)
{
    IKinectSensor   * mySensor = nullptr;
    GetDefaultKinectSensor(&mySensor);  //获取感应器
    mySensor->Open();           //打开感应器

    IDepthFrameSource   * mySource = nullptr;   //取得深度数据
    mySensor->get_DepthFrameSource(&mySource);

    int height = 0, width = 0;
    IFrameDescription   * myDescription = nullptr;  //取得深度数据的分辨率
    mySource->get_FrameDescription(&myDescription);
    myDescription->get_Height(&height);
    myDescription->get_Width(&width);
    myDescription->Release();

    IDepthFrameReader   * myReader = nullptr;
    mySource->OpenReader(&myReader);    //打开深度数据的Reader

    IDepthFrame * myFrame = nullptr;
    Mat temp(height, width, CV_16UC1);    //建立图像矩阵
    Mat img(height, width, CV_8UC1);
    while (1)
    {
        if (myReader->AcquireLatestFrame(&myFrame) == S_OK) //通过Reader尝试获取最新的一帧深度数据,放入深度帧中,并判断是否成功获取
        {
            myFrame->CopyFrameDataToArray(height * width, (UINT16 *)temp.data); //先把数据存入16位的图像矩阵中
            //深度图像保存,以系统时间(毫秒级)命名
            SYSTEMTIME sys;
            GetLocalTime(&sys);
            stringstream ss1, ss2, ss3, ss4;
            string str1, str2, str3, str4;
            ss1 << (sys.wHour);
            ss2 << (sys.wMinute);
            ss3 << (sys.wSecond);
            ss4 << (sys.wMilliseconds);
            str1 = ss1.str();
            str2 = ss2.str();
            str3 = ss3.str();
            str4 = ss4.str();
            imshow("DepthOrigin", temp);
            imwrite("./depthImage/" + str1 + ":" + str2 + ":" + str3 + ":" + str4 + ".png", temp);

            //深度图转伪色彩图
            Mat img_color;
            double imax = 0, imin = 70000;
            int imrow = temp.rows;
            int imcol = temp.cols * temp.channels();
            for (int i = 0; i < imrow; i++)
            {
                for (int j = 0; j < imcol; j++)
                {
                    ushort data = temp.at<ushort>(i, j);
                    if (imin >= data && data != 0)
                    {
                        imin = data;
                    }
                    if (imax <= data)
                    {
                        imax = data;
                    }

                }
            }
            depth2color(img_color,temp,imax,imin);
            imshow("伪彩图",img_color);

            if (waitKey(20) == 27)
            {
                break;
            }

            //temp.convertTo(img, CV_8UC1, 255.0 / 4500);   //再把16位转换为8位
            //imshow("TEST", img);
            myFrame->Release();
        }
        if (waitKey(30) == VK_ESCAPE)
            break;
    }
    myReader->Release();        //释放不用的变量并且关闭感应器
    mySource->Release();
    mySensor->Close();
    mySensor->Release();

    return  0;
}

深度图转换成伪彩色图

函数:http://blog.csdn.net/wzw_ice/article/details/77163703
相关代码也可在上面的cpp文件代码中找到

查看评论

几种深度摄像头简介

随着微软kinect(natal)的发展,深度摄像头吸引越来越多人的目光,深度摄像头可以用在人体跟踪,三维重建,人机交互,SLAM等等领域。但是深度摄像头的高昂的价格实在是让一般人望而却步,我所知道的...
  • hualitlc
  • hualitlc
  • 2014-09-15 11:27:27
  • 5316

深度摄像头测距原理简介

深度检测主要技术方法: 1.双目匹配(双RGB摄像头+可选的照明系统) 三角测量原理即目标点在左右两幅视图中成像的横坐标之间存在的差异(视差Disparity),与目标点到成像平面的距离成反比例的关系...
  • jaylinzhou
  • jaylinzhou
  • 2017-04-26 17:49:07
  • 7506

深度相机(五)--Kinect v2.0

关于Kinect 网上资料很多,不做详细描述。 这里主要记录一下V1.0和V1.2的区别。原文:http://www.cnblogs.com/TracePlus/p/4136297.html 本文主...
  • App_12062011
  • App_12062011
  • 2016-09-25 22:20:07
  • 5923

Kinect v2深度测量原理

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

Kinect 2.0 + OpenCV 显示深度数据、骨架信息、手势状态和人物二值图

使用Kinect 2.0 + OpenCV 获取深度信息(Depth Data),骨架信息(Body Data),手势状态(Hand State)和人物二值图(Body Index Data)。...
  • jiangfan2014
  • jiangfan2014
  • 2014-11-04 02:07:06
  • 8613

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

读取深度图像
  • ktigerhero3
  • ktigerhero3
  • 2015-11-19 17:33:09
  • 7483

kinect 2.0:利用深度进行前景分割(c++实现)

主要思想就是将kinect获取到的深度数据映射到彩色图像上,然后利用阈值过滤掉背景的深度,最后通过深度与彩色的对应关系来得到前景的彩色图像。 kinect2.0官方SDK已经提供了将深度帧映射到彩色...
  • u013358387
  • u013358387
  • 2016-11-22 20:22:55
  • 1722

Kinect摄像头简介

Kinect摄像头简介                                                    http://blog.csdn.net/u012062327 1 R...
  • u012062327
  • u012062327
  • 2016-05-18 15:06:37
  • 5637

kinect2.0 之摄像头

kinect2.0 摄像头研究学习
  • snowbird13
  • snowbird13
  • 2014-12-25 11:10:37
  • 4728

获取深度图任意指定点的深度值

在立体视觉开发的时候,我们常常需要观察摄像头所获取图像的深度值规律,以便进一步提取特征 而在我们提取深度值的时候,往往更希望能够快速准确的获取指定点的深度值 本程序基于Kinect2...
  • cocoaqin
  • cocoaqin
  • 2018-03-26 09:16:44
  • 43
    个人资料
    持之以恒
    等级:
    访问量: 6147
    积分: 218
    排名: 34万+
    文章存档
    最新评论