從零開始學習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); 溜溜球 專案中斷後就沒有接觸了