首先为kinect停产默哀三秒
在过去将近一年的时间里,都在和kinect打交道,从检测球的过环到抛球交接,再到现在开始捣鼓的定位。
调试过和kinect相关的程序现在加起来也有5G多了(不同版本程序存档也算在内)
以后离开kinect后,说不怀念是不可能的(这可是青春啊~)
之于为什么之前不写kinect相关的博文,有两个原因,其一是保密需要,其二是没兴趣写 = =
至于为什么现在才开始写kinect相关的博文,即便是kinect已经停产了,最大的动机是想留下点足迹供未来的自己翻阅
kinect2深度图读取与保存
回归正题
我们在做视觉开发的时候
为了调试的方便,往往会把摄像头采集到的图像保存在本地
方便多次离线调试,开发kinect也不例外。
至于怎么保存图片,我们可以利用opencv中带的imwrite函数进行保存
而这儿需要注意的事,kinect采集的图像是16位图像,因此我们在保存图片的时候,应该采用png格式进行16位图保存
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
///////////////////////////////////////// /// COPYRIGHT NOTICE /// All rights reserved. /// /// kinect2深度图采集 /// /// @version 1.0 /// @author 七克 /// @E-mail:xkeqin@gmail.com /// @date 2018/3/25 ///////////////////////////////////////// #include <fstream> #include <conio.h> #include <Windows.h> #include <Kinect.h> #include <opencv2\opencv.hpp>‘ #include <opencv2/imgproc/imgproc.hpp> #include "stdio.h" using namespace cv; using namespace std; char key; // Safe release for interfaces template<class Interface> inline void SafeRelease(Interface *& pInterfaceToRelease) { if (pInterfaceToRelease != NULL) { pInterfaceToRelease->Release(); pInterfaceToRelease = NULL; } } int main() { /***Current Kinect***/ IKinectSensor* m_pKinectSensor; HRESULT hr; /********Depth********/ static const int cDepthWidth = 512; static const int cDepthHeight = 424; int count = 0; // Depth reader IDepthFrameReader* m_pDepthFrameReader = NULL; hr = GetDefaultKinectSensor(&m_pKinectSensor); if (m_pKinectSensor) { // Initialize the Kinect and get the depth reader IDepthFrameSource* pDepthFrameSource = NULL; hr = m_pKinectSensor->Open(); if (SUCCEEDED(hr)) { hr = m_pKinectSensor->get_DepthFrameSource(&pDepthFrameSource); } if (SUCCEEDED(hr)) { hr = pDepthFrameSource->OpenReader(&m_pDepthFrameReader); } SafeRelease(pDepthFrameSource); } while (1) { IDepthFrame* pDepthFrame = NULL; HRESULT hr = m_pDepthFrameReader->AcquireLatestFrame(&pDepthFrame); if (SUCCEEDED(hr)) { IFrameDescription* pFrameDescription = NULL; /*******************************************************/ //局部变量定义处 /*******************************************************/ int nWidth = 512; int nHeight = 424; USHORT nDepthMinReliableDistance = 0; USHORT nDepthMaxDistance = 0; UINT nBufferSize = 0; UINT16 *pBuffer = NULL; USHORT depth; if (SUCCEEDED(hr)) { hr = pDepthFrame->get_FrameDescription(&pFrameDescription); } if (SUCCEEDED(hr)) { hr = pFrameDescription->get_Width(&nWidth); } if (SUCCEEDED(hr)) { hr = pFrameDescription->get_Height(&nHeight); } if (SUCCEEDED(hr)) { hr = pDepthFrame->get_DepthMinReliableDistance(&nDepthMinReliableDistance); } if (SUCCEEDED(hr)) { nDepthMaxDistance = USHRT_MAX; } if (SUCCEEDED(hr)) { hr = pDepthFrame->AccessUnderlyingBuffer(&nBufferSize, &pBuffer); } if (SUCCEEDED(hr)) { Mat DepthImage(nHeight, nWidth, CV_16UC1, pBuffer); Mat depth_image(nHeight, nWidth, CV_16UC1); const UINT16* pBufferEnd = pBuffer + (nWidth * nHeight); //结束点 depth_image = DepthImage.clone(); char filename[200]; sprintf(filename, "Picture%d.png", ++count); imwrite(filename, depth_image);//图片保存到本工程目录中 imshow("depth", depth_image*100); waitKey(300); } SafeRelease(pFrameDescription); } SafeRelease(pDepthFrame); } return 0; } |
效果
该程序实现了每隔300ms(大概的,还得视帧率)采集一幅图并保存的效果
由于是深度图,黑黑的~