1. 程式人生 > >從零開始學習Kinect程式設計筆記(三) 4.23

從零開始學習Kinect程式設計筆記(三) 4.23

睡到中午11點半才起來 orz 中午又吃太多了,什麼時候才能到155啊!! 昨天寫到環境配置 配置完之後可以開始程式設計了

下面這些是轉載別人的文章程式碼

#include <windows.h>  
#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(480, 640, CV_8UC3);  
   
    //1、初始化NUI   
    HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_COLOR);   
    if (FAILED(hr))   
    {   
        cout<<"NuiInitialize failed"<<endl;   
        return hr;   
    }   
  
    //2、定義事件控制代碼   
    //建立讀取下一幀的訊號事件控制代碼,控制KINECT是否可以開始讀取下一幀資料  
    HANDLE nextColorFrameEvent = CreateEvent( NULL, TRUE, FALSE, NULL );  
    HANDLE colorStreamHandle = NULL; //儲存影象資料流的控制代碼,用以提取資料   
   
    //3、開啟KINECT裝置的彩色圖資訊通道,並用colorStreamHandle儲存該流的控制代碼,以便於以後讀取  
    hr = NuiImageStreamOpen(NUI_IMAGE_TYPE_COLOR, NUI_IMAGE_RESOLUTION_640x480,   
                            0, 2, nextColorFrameEvent, &colorStreamHandle);   
    if( FAILED( hr ) )//判斷是否提取正確   
    {   
        cout<<"Could not open color image stream video"<<endl;   
        NuiShutdown();   
        return hr;   
    }  
    namedWindow("colorImage", CV_WINDOW_AUTOSIZE);  
   
    //4、開始讀取彩色圖資料   
    while(1)   
    {   
        const NUI_IMAGE_FRAME * pImageFrame = NULL;   
  
        //4.1、無限等待新的資料,等到後返回  
        if (WaitForSingleObject(nextColorFrameEvent, INFINITE)==0)   
        {   
            //4.2、從剛才開啟資料流的流控制代碼中得到該幀資料,讀取到的資料地址存於pImageFrame  
            hr = NuiImageStreamGetNextFrame(colorStreamHandle, 0, &pImageFrame);   
            if (FAILED(hr))  
            {  
                cout<<"Could not get color 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<uchar>(i);  //第i行的指標  
                      
                    //每個位元組代表一個顏色資訊,直接使用uchar  
                    uchar *pBuffer = (uchar*)(LockedRect.pBits) + i * LockedRect.Pitch;  
                    for (int j=0; j<image.cols; j++)   
                    {   
                        ptr[3*j] = pBuffer[4*j];  //內部資料是4個位元組,0-1-2是BGR,第4個現在未使用   
                        ptr[3*j+1] = pBuffer[4*j+1];   
                        ptr[3*j+2] = pBuffer[4*j+2];   
                    }   
                }   
                imshow("colorImage", image); //顯示影象   
            }   
            else   
            {   
                cout<<"Buffer length of received texture is bogus\r\n"<<endl;   
            }  
  
            //5、這幀已經處理完了,所以將其解鎖  
            pTexture->UnlockRect(0);  
            //6、釋放本幀資料,準備迎接下一幀   
            NuiImageStreamReleaseFrame(colorStreamHandle, pImageFrame );   
        }   
        if (cvWaitKey(20) == 27)   
            break;   
    }   
    //7、關閉NUI連結   
    NuiShutdown();   
    return 0;  
}  

開啟vs2015中配置好的專案 標頭檔案

#include <windows.h>  
#include <iostream>   
#include <NuiApi.h>  
#include <opencv2/opencv.hpp> 

windows.h

WINDOWS.H是一個最重要的標頭檔案,它包含了其他Windows標頭檔案,這些標頭檔案的某些也包含了其他標頭檔案。這些標頭檔案中最重要的和最基本的是: WINDEF.H 基本資料型別定義。 WINNT.H 支援Unicode的型別定義。 windows.h WINBASE.H Kernel(核心)函式。 WINUSER.H 使用者介面函式。 WINGDI.H 圖形裝置介面函式。 這些標頭檔案定義了Windows的所有資料型態、函式呼叫、資料結構和常數識別字,它們是Windows檔案中的一個重要部分。 檔案路徑:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include。

NuiApi.h 和Windows.h 一樣是kinect程式設計必要的標頭檔案 opencv2/opencv.hpp 是opencv程式設計需要的標頭檔案

匯入名稱空間

using namespace std;  
using namespace cv;  

1、初始化NUI

HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_COLOR); 任何想使用微軟提供的API來操作KINECT,都必須在所有操作之前,呼叫NUI的初始化函式

HRESULT NuiInitialize(DWORD dwFlags);

dwFlags引數是以標誌位的含義存在的。你可以使用下面幾個值來指定你打算使用NUI中的哪些內容。

NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX 提供帶使用者資訊的深度圖資料;

NUI_INITIALIZE_FLAG_USES_COLOR 提供色彩影象資料;

NUI_INITIALIZE_FLAG_USES_SKELETON 提供骨骼點資料;

NUI_INITIALIZE_FLAG_USES_DEPTH 提供深度影象資料.

NUI_INITIALIZE_FLAG_USES_AUDIO 提供聲音資料;

以上的標誌位,你可以使用一個,也可以用 | 操作符將它們組合在一起。 //只使用彩色圖 HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_COLOR);

//使用帶使用者資訊的深度圖/使用使用者骨骼框架/使用彩色圖 HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_DEPTH_AND_PLAYER_INDEX | NUI_INITIALIZE_FLAG_USES_SKELETON | NUI_INITIALIZE_FLAG_USES_COLOR); 溜溜球 專案中斷後就沒有接觸了