假設VS2010已安裝並可以正常使用。
一. 安裝和配置Kinect for Windows SDK v1.7
在官方網站下載Kinect for Windows SDK和Developer Toolkit:
KinectSDK-v1.7-Setup.exe (主要提供Kinect的驅動和裝置提供者)(連結地址:https://www.microsoft.com/en-us/download/details.aspx?id=36996)
KinectDeveloperToolkit-v1.7.0-Setup.exe (主要提供一些有助於開發的工具,包括Kinect Studio和多種程式設計語言的開發常式等))連結地址:https://www.microsoft.com/en-us/download/details.aspx%3Fid%3D36998)
按照預設選項安裝完成後,接入Kinect,系統將會自動的搜尋驅動進行安裝。開啟裝置管理員(右鍵我的電腦->管理->裝置管理員)查看驅動是否安裝成功:
再開啟Developer Toolkit Browser v1.7.0 (Kinect for Windows):
測試讀取深度映像的例子:
二. 安裝OpenCV2.4.9
我在另一篇文章裡已經介紹,詳見http://blog.csdn.net/lizhiguo18/article/details/51037366 三. VS2010配置
開啟VS2010,建立project,命名為"KinectDepthData"。接下來要配置相關的庫和包以及它們的路徑
OpenCV:
(1) Include files加入E:\opencv\build\include;
(2) Library files加入E:\opencv\build\x64\vc10\lib;
(3) 在Linker的Input中,添加Additional Dependencies(根據需要添加): opencv_core2410d.lib opencv_imgproc2410d.lib opencv_highgui2410d.lib opencv_ml2410d.lib opencv_video2410d.lib opencv_features2d2410d.lib opencv_calib3d2410d.lib opencv_objdetect2410d.lib opencv_contrib2410d.lib opencv_legacy2410d.lib opencv_flann2410d.lib
Kinect:
(1) Include files加入C:\Program Files\Microsoft SDKs\Kinect\v1.7\inc;
(2) Library files加入C:\Program Files\Microsoft SDKs\Kinect\v1.7\lib\amd64;
(3) 在Linker的Input中,添加Additional Dependencies:
Kinect10.lib
四. 測試用Kinect讀取深度映像並用OpenCV顯示
// KinectDepthData.cpp : 定義控制台應用程式的進入點。/************************************************代碼原作者:zouxy09來自:http://http://blog.csdn.net/zouxy09/article/details/8146266Kinect for Windows SDK + OpenCV2讀取並顯示深度映像************************************************/#include "stdafx.h"#include #include "iostream";#include "NuiApi.h";#include "opencv2/opencv.hpp";using namespace std;using namespace cv;int main(int argc, char *argv[]){Mat image; // 這裡我們用灰階圖來表述深度資料,越遠的資料越暗 image.create(240, 320, CV_8UC1); // 1. 初始化NUI,注意這裡傳入的參數有變化,為DEPTH HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_DEPTH); if (FAILED(hr)) { cout << "NuiInitialize failed" << endl; return hr; } // 2. 定義事件控制代碼 // 建立讀取下一幀的訊號事件控制代碼,控制Kinect是否可以開始讀取下一幀資料 HANDLE nextColorFrameEvent = CreateEvent(NULL, TRUE, FALSE, NULL); HANDLE depthStreamHandle = NULL; // 儲存映像資料流的控制代碼,用以提取資料 // 3. 開啟Kinect裝置的深度圖資訊通道,並用depthStreamHandle儲存該流的控制代碼,以便以後讀取 hr = NuiImageStreamOpen(NUI_IMAGE_TYPE_DEPTH, NUI_IMAGE_RESOLUTION_320x240,0, 2, nextColorFrameEvent, &depthStreamHandle); if (FAILED(hr)) // 判斷讀取是否正確 { cout << "Could not open color image stream video" << endl; NuiShutdown(); return hr; } namedWindow("depthImage", CV_WINDOW_AUTOSIZE); // 4. 開始讀取深度資料 while (true) { const NUI_IMAGE_FRAME * pImageFrame = NULL; // 4.1 無限等待新的資料,等到後返回 if (WaitForSingleObject(nextColorFrameEvent, INFINITE) == 0) { // 4.2 從剛才開啟資料流的流控制代碼中得到該幀資料,讀取到的資料地址存於pImageFrame hr = NuiImageStreamGetNextFrame(depthStreamHandle, 0, &pImageFrame); if (FAILED(hr)) // 判斷讀取是否正確 { cout << "Could not get depth image" << endl; NuiShutdown(); return -1; } INuiFrameTexture * pTexture = pImageFrame->pFrameTexture; NUI_LOCKED_RECT LockedRect; // 4.3 提取資料幀到LockedRect,它包括兩個資料對象:Pitch每行位元組數,pBits第一個位元組地址 // 並鎖定資料,這樣當我們讀取資料時,Kinect就不會去修改它 pTexture->LockRect(0, &LockedRect, NULL, 0); // 4.4 確定獲得的資料是否有效 if (LockedRect.Pitch != 0) { // 4.5 將資料轉換為OpenCV的Mat格式 for (int i = 0; i < image.rows; ++i) { uchar *ptr = image.ptr(i); // 第i行的指標 // 深度映像資料含有兩種格式,這裡像素的低12位表示一個深度值,高4位未使用 // 注意這裡需要進行轉換,因為每個資料是2個位元組,儲存的同上面擷取的顏色資訊不一樣 uchar *pBufferRun = (uchar*)(LockedRect.pBits) + i * LockedRect.Pitch; USHORT *pBuffer = (USHORT*)pBufferRun; for (int j = 0; j < image.cols; ++j) { ptr[j] = 255 - (uchar)(256 * pBuffer[j] / 0x0fff); // 直接將資料歸一化處理 } } imshow("depthImage", image); } else { cout << "Buffer length of received texture is bogus\r\n" << endl; } // 5. 這一幀已經處理完了,所以將其解鎖 pTexture->UnlockRect(0); // 6. 釋放本幀資料,準備迎接下一幀 NuiImageStreamReleaseFrame(depthStreamHandle, pImageFrame); } if (cvWaitKey(20) == 27) { break; } } // 7. 關閉NUI連結return 0;}