Kinect v2——visual studio环境配置
字数统计:805 阅读时长 ≈ 3分钟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