? 欧美激情视频精品一区二区,久久久g0g0午夜无码精品
聯(lián)系我們

給我們留言

聯(lián)系我們

地址:福建省晉江市青陽街道洪山路國際工業(yè)設(shè)計(jì)園納金網(wǎng)

郵箱:info@narkii.com

電話:0595-82682267

(周一到周五, 周六周日休息)

當(dāng)前位置:主頁 > 3D教程 > 3D教程

Kinect開發(fā)教程二:OpenNI讀取深度圖像與彩色圖像

來源: 小斤(陳忻)專欄 | 責(zé)任編輯:陳玉泳 | 發(fā)布時(shí)間: 2013-07-02 10:26 | 瀏覽量:

  大家應(yīng)該發(fā)現(xiàn)Kinect上長了三只眼睛,其中一個(gè)是彩色攝像頭,另外兩個(gè)深度攝像頭,一個(gè)負(fù)責(zé)發(fā)射紅外光,一個(gè)負(fù)責(zé)接收,這樣,我們便能通過Kinect得到一幅彩色圖像和一幅深度圖像。現(xiàn)在小斤來講下第一個(gè)范例,就是是通過OpenNI得到彩色和深度圖像咯,代碼不長,其中一部分參考了Heresky童鞋的文章《透過 OpneNI 合併 Kinect 深度以及彩色影像資料》,此外,又補(bǔ)充了OpenCV的顯示部分,使范例更為直觀。

  1. #include <stdlib.h>  
  2. #include <iostream>  
  3. #include <string>  
  4. //【1】  
  5. #include <XnCppWrapper.h>  
  6. #include "opencv/cv.h"  
  7. #include "opencv/highgui.h"  
  8.   
  9. using namespace std;  
  10. using namespace cv;  
  11.   
  12. void CheckOpenNIError( XnStatus result, string status )  
  13. {   
  14.     if( result != XN_STATUS_OK )   
  15.         cerr << status << " Error: " << xnGetStatusString( result ) << endl;  
  16. }  
  17.   
  18. int main( int argc, char** argv )  
  19. {  
  20.     XnStatus result = XN_STATUS_OK;    
  21.     xn::DepthMetaData depthMD;  
  22.     xn::ImageMetaData imageMD;  
  23.   
  24.     //OpenCV  
  25.     IplImage*  imgDepth16u=cvCreateImage(cvSize(640,480),IPL_DEPTH_16U,1);  
  26.     IplImage* imgRGB8u=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);  
  27.     IplImage*  depthShow=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);  
  28.     IplImage* imageShow=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);  
  29.     cvNamedWindow("depth",1);  
  30.     cvNamedWindow("image",1);  
  31.     char key=0;  
  32.   
  33.     //【2】  
  34.     // context   
  35.     xn::Context context;   
  36.     result = context.Init();   
  37.     CheckOpenNIError( result, "initialize context" );    
  38.   
  39.     // creategenerator    
  40.     xn::DepthGenerator depthGenerator;    
  41.     result = depthGenerator.Create( context );   
  42.     CheckOpenNIError( result, "Create depth generator" );    
  43.     xn::ImageGenerator imageGenerator;  
  44.     result = imageGenerator.Create( context );   
  45.     CheckOpenNIError( result, "Create image generator" );  
  46.   
  47.     //【3】  
  48.     //map mode    
  49.     XnMapOutputMode mapMode;   
  50.     mapMode.nXRes = 640;    
  51.     mapMode.nYRes = 480;   
  52.     mapMode.nFPS = 30;   
  53.     result = depthGenerator.SetMapOutputMode( mapMode );    
  54.     result = imageGenerator.SetMapOutputMode( mapMode );    
  55.   
  56.     //【4】  
  57.     // correct view port    
  58.     depthGenerator.GetAlternativeViewPointCap().SetViewPoint( imageGenerator );   
  59.   
  60.     //【5】  
  61.     //read data  
  62.     result = context.StartGeneratingAll();    
  63.     //【6】  
  64.     result = context.WaitNoneUpdateAll();    
  65.   
  66.     while( (key!=27) && !(result = context.WaitNoneUpdateAll( ))  )   
  67.     {    
  68.         //get meta data  
  69.         depthGenerator.GetMetaData(depthMD);   
  70.         imageGenerator.GetMetaData(imageMD);  
  71.   
  72.         //【7】  
  73.         //OpenCV output  
  74.         memcpy(imgDepth16u->imageData,depthMD.Data(),640*480*2);  
  75.         cvConvertScale(imgDepth16u,depthShow,255/4096.0,0);  
  76.         memcpy(imgRGB8u->imageData,imageMD.Data(),640*480*3);  
  77.         cvCvtColor(imgRGB8u,imageShow,CV_RGB2BGR);  
  78.         cvShowImage("depth", depthShow);  
  79.         cvShowImage("image",imageShow);  
  80.         key=cvWaitKey(20);  
  81.     }  
  82.   
  83.     //destroy  
  84.     cvDestroyWindow("depth");  
  85.     cvDestroyWindow("image");  
  86.     cvReleaseImage(&imgDepth16u);  
  87.     cvReleaseImage(&imgRGB8u);  
  88.     cvReleaseImage(&depthShow);  
  89.     cvReleaseImage(&imageShow);  
  90.     context.StopGeneratingAll();  
  91.     context.Shutdown();  
  92.     return 0;  
  93. }  

現(xiàn)在我們來解釋一下:

【1】<XnCppWrapper.h>便是OpenNI的文件頭了,使用OpenNI的話,目前只要include這個(gè)就行。

【2】DepthGenerator和ImageGenerator,小斤稱之為圖像生成器,前者負(fù)責(zé)深度圖像,后者負(fù)責(zé)彩色圖像。創(chuàng)建一個(gè)生成器非常簡單,首先我們要初始化一個(gè)Context上下文,然后把Context作為Create函數(shù)的參數(shù),便可以創(chuàng)建生成器了。

【3】XnMapOutputMode是用來設(shè)定生成器的參數(shù)的,這邊小斤設(shè)定了分辨率為640*480(標(biāo)準(zhǔn)),30fps采樣。

【4】depthGenerator.GetAlternativeViewPointCap().SetViewPoint( imageGenerator)這句話也許會讓大家疑惑,它是用來調(diào)整視角的。為什么要調(diào)整呢?因?yàn)镵inect的三只眼長在不同的地方,所以畫幅一致的深度攝像頭和彩色攝像頭,它們看出來的景物是有偏差的,這里OpenNI提供了函數(shù)進(jìn)行對齊。這里,小斤把深度生成器的視角,設(shè)定為彩色生成器的視角。

【5】調(diào)用StartGeneratingAll()后,生成器們便開始上班了,如果要結(jié)束,就StopGeneratingAll()函數(shù)。

【6】盡管生成器們在工作了,但他們一直忙著各讀各的,沒有人協(xié)調(diào),自己不會乖乖把最新的資料給我們。我們調(diào)用getMetaData()方法前,需要使用WaitAnyUpdateAll()、WaitOneUpdateAll()、WaitNoneUpdateAll()和WiatAndUpdateAll()中的一種。功能如其名,這邊小斤使用的是WaitNoneUpdateAll()函數(shù),它比較暴力,不管生成器有沒有讀到新數(shù)據(jù),我這邊先更新了再說。大家可以試試其它三個(gè),看看效果。

【7】這邊使用OpenNI獲得圖像MetaData數(shù)據(jù)后,小斤通過一系列函數(shù),轉(zhuǎn)換為OpenCV的IplImage圖像類型,然后輸出。

對于深度MetaData,這邊使用cvConvertScale轉(zhuǎn)換尺度,成為灰度值[0,255]的灰度圖。對于彩色MetaData,使用cvCvtColor轉(zhuǎn)換色彩空間即可。按ESC鍵可以退出循環(huán),結(jié)束程序。

 最終效果如下:

 在灰度圖中灰度值0顯示為黑色,255為白色,所以,離Kinect近的地方(桌面)顯示為黑色,中間為不同程度的灰色,遠(yuǎn)處(天花板)顯示為白色。(精彩Kinect資訊請繼續(xù)關(guān)注納金網(wǎng)http://www.594ljc.cn/


相關(guān)文章
網(wǎng)友評論

您需要登錄后才可以發(fā)帖 登錄 | 立即注冊

關(guān)閉

全部評論:0條

推薦
熱門