赞
踩
目录
1、【翻译】Kinect v2程序设计(C++) Depth编
①总结:good:作者翻译了一个系列的Kinect2的文章,目前测试Color和Depth篇,都能实现,下面是参考后直接实现的代码
2、Kinect2+opencv之Color篇:显示Kinect2的画面
①安全释放函数:ColorBasics-D2D里面有的直接复制过来
②OnInitDialog函数中使用到Test_kinect函数
https://www.cnblogs.com/TracePlus/p/4136357.html
https://blog.csdn.net/qq_40544338/article/details/105392479
这个再次就不赘述了,网上很多的教程
- #include "Kinect.h"
-
- #include "cv.h"
- #include <iostream>
-
- #include "opencv2/opencv.hpp"
- public:
- int Test_kinect2();
- // Safe release for interfaces
- template<class Interface>
- inline void SafeRelease(Interface *& pInterfaceToRelease)
- {
- if (pInterfaceToRelease != NULL)
- {
- pInterfaceToRelease->Release();
- pInterfaceToRelease = NULL;
- }
- }
- //功能:显示Kinect2的深度图
- //参考:https://www.cnblogs.com/TracePlus/p/4136357.html
- int CMyKinect2Dlg::Test_kinect2()
- {
- //第一步:取得「Sensor」
- IKinectSensor* pSensor;//处理Kinect v2预览版的Sensor接口。
- HRESULT hResult = S_OK;
- hResult = GetDefaultKinectSensor(&pSensor);//取得默认的Sensor
- if (FAILED(hResult))
- {
- std::cout << "Error : GetDefaultKinectSensor" << std::endl;
- return -1;
- }
- hResult = pSensor->Open();//打开Sensor
- if (FAILED(hResult))
- {
- std::cout << "Error : IKinectSensor::Open()" << std::endl;
- return -1;
- }
-
-
- // 第二步:从「Sensor」取得「Source」。
- IDepthFrameSource* pDepthSource; //取得Depth Frame的Source接口。
- hResult = pSensor->get_DepthFrameSource(&pDepthSource);// 从Sensor取得Source。
- if (FAILED(hResult))
- {
- std::cerr << "Error : IKinectSensor::get_DepthFrameSource()" << std::endl;
- return -1;
- }
-
-
- // 第三步:「Source」从打开「Reader」
- IDepthFrameReader* pDepthReader;//取得Depth Frame的Reader接口。
- hResult = pDepthSource->OpenReader(&pDepthReader);//从Source打开Reader
- if (FAILED(hResult))
- {
- std::cerr << "Error : IDepthFrameSource::OpenReader()" << std::endl;
- return -1;
- }
-
- //第四步:从「Reader」取得最新的「Frame」
- int width = 512;//Depth数据的尺寸(512×424) 这里为了简化说明,画像尺寸用硬代码来设定,示例程序可以Source取得着Frame信息。
- int height = 424;
- unsigned int bufferSize = width * height * sizeof(unsigned short);//Depth数据的尺寸
- cv::Mat bufferMat(height, width, CV_16SC1);//为了处理Depth数据而准备的OpenCV的cv::Mat类型 //「bufferMat」是16bit的原始的Depth数据,「CV_16SC1」,是把无符号16bit整数(16S) 放入1个channel(C1)并列来表现1个像素的数据格式。(注:应该是CV_16UC1才对)
- cv::Mat depthMat(height, width, CV_8UC1);//「depthMat」为了作为图像显示,把Depth数据储存到8bit的范围里的处理。「CV_8UC1」,是表现无符号8bit整数 (8U)的数据格式。
- cv::namedWindow("Depth");
- while (1)
- {
- // Frame
- IDepthFrame* pDepthFrame = nullptr;//取得Depth数据的Frame接口
- hResult = pDepthReader->AcquireLatestFrame(&pDepthFrame);//从Reader取得最新的Frame
- if (SUCCEEDED(hResult))
- {
- hResult = pDepthFrame->AccessUnderlyingBuffer(&bufferSize, reinterpret_cast<UINT16**>(&bufferMat.data));//从Frame取得Depth数据。 取得Depth数据存储数组的指针。这里为了Depth数据可视化,方便变化处理,用cv::Mat类型来获取。
- if (SUCCEEDED(hResult))
- {
- bufferMat.convertTo(depthMat, CV_8U, -255.0f / 4500.0f, 255.0f);//为了显示Depth数据图像,从16bit转换为8bit。如果得到「Frame」,就可以把取出Depth数据,作成图像来可视化
- }
- }
- SafeRelease(pDepthFrame);
- // Show Window
- cv::imshow("Depth", depthMat);
- if (cv::waitKey(30) == VK_ESCAPE)
- {
- break;
- }
- }
-
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。