Kinect開發環境配置:Kinect for Windows SDK + OpenCV2.4.10 + VS2010 + Win7(x64)

來源:互聯網
上載者:User

假設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;}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.