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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzw_ice/article/details/77171229

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

处理器:支持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文件代码中找到

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页