Kinect v2——visual studio环境配置

under Kinect  tag     Published on March 25th , 2020 at 01:25 am

一、安装Kinect SDK

1. 下载SDK

官网下载 Kinect v2 SDK

2. 测试设备运行情况

kinect插电后,电源适配器指示灯为黄色,当kinect通过USB与电脑连接后,电源适配器指示灯变为白色(这一点并不能区分USB2.0和3.0,因为都会变为白色)。然后打开刚才装好的SDK Browser v2.0

选择Kinect Configuration Verifier

查看运行结果,观察Kinect两颗白色小灯和三个红外线主动补光亮就表示kinect 2.0已经正常启动!

这里有个问题,虽然USB用的是3.0,但是依旧出现了黄色感叹号。不过不影响使用,无视就好。

二、VS环境配置——Kinect

1. 为了同时使用OpenCV,将平台改为x64

2. C/C++ 附件包含目录设置

在解决方案资源管理器中找到工程名,右键,选择属性

在【c/c++】——【常规】——【附加包含目录】中添加【对应的kinect路径下的inc文件的地址】

3. 链接器 包含目录设置

在【链接器】——【常规】——【附加库目录】下添加 【自己对应的kinect安装地址的x64/x86的文件夹的目录】

4. 连接器 添加附加依赖项

在【链接器】——【输入】——【附加依赖项】中添加kinect20.lib文件 【20表示的是kinect 2.0 其他版本不清楚 建议上网搜索一下】

三、VS环境配置——OpenCV

1. 下载OpenCV

前往OpenCV官网下载OpenCV,这里选择的是最新版本。因为是在Windows上直接使用,所以选择Windows版本,免去编译的麻烦。

下载完成后,解压到自定义路径,注意路径不要有中文

2. 设置包含目录

在“VC++目录”中,点击“包含目录”,点击编辑,添加:

F:\OPENCV\opencv\build\include

F:\OPENCV\opencv\build\include\opencv2

3. 设置库目录

在“VC++目录”中,点击“库目录”,点击编辑,添加:

F:\OPENCV\opencv\build\x64\vc14\lib

4. 设置附加依赖项

点击“链接器”,“附加依赖项”,添加:

opencv_world420d.lib

注意,不同版本的该文件名有区别,debug版本要加后缀d,建议直接从以下目录查看
opencv_world420d.lib文件路径为 F:\opencv\build\x64\vc14\lib
同时需要把F:\opencv\build\x64\vc14\bin添加到系统环境变量,添加后重启生效

5. OpenCV测试

使用下列测试代码查看CV是否配置成功

#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
    const char* imagename = "F:\\test.bmp";//此处为你自己的图片路径

    //从文件中读入图像
    Mat img = imread(imagename, 1);

    //如果读入图像失败
    if (img.empty())
    {
        fprintf(stderr, "Can not load image %s\n", imagename);
        return -1;
    }
    //显示图像
    imshow("image", img);

    //此函数等待按键,按键盘任意键就返回
    waitKey();
    return 0;
}

四、测试

使用以下代码测试Kinect与OpenCV是否配置成功

// kinect_dev1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>

// OpenCV 头文件
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
// Kinect for Windows SDK 头文件
#include <Kinect.h>

using namespace std;

int main()
{
    cout << "Hello World!\n"; 

    // 1a.获取感应器
    IKinectSensor* pSensor = nullptr;
    GetDefaultKinectSensor(&pSensor);

    // 1b. 打开感应器
    pSensor->Open();

    // 2a. 取得深度数据
    IDepthFrameSource* pFrameSource = nullptr;
    pSensor->get_DepthFrameSource(&pFrameSource);

    // 2b. 取得深度数据的描述信息(宽、高)
    int        iWidth = 0;
    int        iHeight = 0;
    IFrameDescription* pFrameDescription = nullptr;
    pFrameSource->get_FrameDescription(&pFrameDescription);
    pFrameDescription->get_Width(&iWidth);
    pFrameDescription->get_Height(&iHeight);
    pFrameDescription->Release();
    pFrameDescription = nullptr;

    // 2c. 取得感应器的“可靠深度”的最大、最小距离
    UINT16 uDepthMin = 0, uDepthMax = 0;
    pFrameSource->get_DepthMinReliableDistance(&uDepthMin);
    pFrameSource->get_DepthMaxReliableDistance(&uDepthMax);
    cout << "Reliable Distance: "
        << uDepthMin << " – " << uDepthMax << endl;

    // 建立图像矩阵,mDepthImg用来存储16位的图像数据,直接用来显示会接近全黑
    //不方便观察,用mImg8bit转换成8位再显示
    cv::Mat mDepthImg(iHeight, iWidth, CV_16UC1);
    cv::Mat mImg8bit(iHeight, iWidth, CV_8UC1);
    cv::namedWindow("DepthImage");

    // 3a. 打开深度数据阅读器
    IDepthFrameReader* pFrameReader = nullptr;
    pFrameSource->OpenReader(&pFrameReader);

    // 主循环
    while (1)
    {
        // 4a. 取得最新数据
        IDepthFrame* pFrame = nullptr;
        if (pFrameReader->AcquireLatestFrame(&pFrame) == S_OK)
        {
            // 4c. 把数据存入16位图像矩阵中
            pFrame->CopyFrameDataToArray(iWidth * iHeight,
                reinterpret_cast<UINT16*>(mDepthImg.data));//强制转换数据类型

           // 4d. 把16位转换成8位
            mDepthImg.convertTo(mImg8bit, CV_8U, 255.0f / uDepthMax);//converto()第一个参数是输出矩阵,第二个是转换类型,第三个是缩放因子,其中4500是深度数据的最大距离
            cv::imshow("DepthImage", mImg8bit);
            //要改变显示的颜色和效果,就改变从mDepthImg到mImg8bit的转换  
            // 4e. 释放变量pFrame
            pFrame->Release();
        }

        if (cv::waitKey(30) == VK_ESCAPE) {
            break;
        }
    }

    // 3b. 释放变量pFrameReader
    pFrameReader->Release();
    pFrameReader = nullptr;

    // 2d.释放变量pFramesSource
    pFrameSource->Release();
    pFrameSource = nullptr;

    // 1c.关闭感应器
    pSensor->Close();

    // 1d.释放感应器
    pSensor->Release();
    pSensor = nullptr;

    return 0;

}

本文由simyng创作, 采用知识共享署名4.0 国际许可协议进行许可,转载前请务必署名
  文章最后更新时间为:March 24th , 2020 at 05:25 pm