博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Kinect For Windows V2开发日志四:使用OpenCV显示深度图像
阅读量:6829 次
发布时间:2019-06-26

本文共 1887 字,大约阅读时间需要 6 分钟。

代码示例:

#include 
#include
#include
using namespace std;using namespace cv;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位的图像矩阵中 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;}

详细解释

为了简便起见,此段代码同样略掉了大部分错误检测。不难看出此段代码于非常相似,主要区别在循环里。

首先,声明了两个矩阵,一个为16位单通道,一个为8位单通道,之所以开16位的,是因为在这篇里可以看到,深度数据是16位的。开8位的原因等下说。然后同样的,利用AcquireLatestFrame()来获取最新的一帧,不同的是下面一句,不再用AccessUnderlyingBuffer(),而是用CopyFrameDataToArray来把数据复制到openCV的图像矩阵Mat里,注意第三个参数的类型是UINT16*,所以需要强制转换一下。接下来要把16位的Mat转换成8位来输出显示,为什么不直接用16位?其实也可以用,但是直接用16位的话显示的图像很接接近于全黑,不方便观察,于是转换为8位。convertTo()这个函数的第一个参数是输出矩阵,第二个是转换的类型,第三个是缩放因子,其中4500是深度数据的最大距离。

最后,输出的图像应该像这样:

o_Kinect%e6%b7%b1%e5%ba%a6%e5%9b%be%e5%83%8f.png

转载于:https://www.cnblogs.com/xz816111/p/5184517.html

你可能感兴趣的文章
(转)淘淘商城系列——导入商品数据到索引库
查看>>
Hibernate(十一):映射继承关系的三种方案
查看>>
oracle数据库使用之数据查询入门
查看>>
通过cat方式生成yum源
查看>>
属性动画的概念解析--实现星星控件
查看>>
java之JMX
查看>>
指针常量与常量指针
查看>>
在web.config中配置httpHandlers节点是的说明
查看>>
c++:数据类型的推断type_traits
查看>>
物理结构与逻辑结构
查看>>
Storm工作流程
查看>>
Opencv探索之路(十九):读写xml和yml文件
查看>>
Eclipse插件开发中的选择监听机制(Selection Provider-Listener)
查看>>
14.并发与异步 - 2.任务Task -《果壳中的c#》
查看>>
Linux时间子系统之三:jiffies
查看>>
使用 VisualVM 进行性能分析及调优
查看>>
linux升级OpenSSL
查看>>
《QQ欢乐斗地主》山寨版
查看>>
病毒木马查杀实战第015篇:U盘病毒之脱壳研究
查看>>
SDK是什么?什么是SDK
查看>>