Ogre + Kinect

  • 4907
  • 0
  • 2012-09-21

摘要:Ogre + Kinect

Ogre 和 Kinect要合體了

開了一個新的Ogre專案, 把Kinect 的Header放到程式裏

#include <NuiApi.h>

結果出現一堆錯誤


2>C:\Program Files\Microsoft SDKs\Kinect\v1.5\inc\NuiSensor.h(46): error C2146: syntax error : missing ';' before identifier 'INuiAudioBeam'
2>C:\Program Files\Microsoft SDKs\Kinect\v1.5\inc\NuiSensor.h(46): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
2>C:\Program Files\Microsoft SDKs\Kinect\v1.5\inc\NuiSensor.h(46): error C2146: syntax error : missing ';' before identifier 'INuiAudioBeam'
2>C:\Program Files\Microsoft SDKs\Kinect\v1.5\inc\NuiSensor.h(46): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
2>C:\Program Files\Microsoft SDKs\Kinect\v1.5\inc\NuiSensor.h(46): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
2>C:\Program Files\Microsoft SDKs\Kinect\v1.5\inc\NuiSensor.h(46): error C2086: 'int INuiAudioBeam' : redefinition
2>          C:\Program Files\Microsoft SDKs\Kinect\v1.5\inc\NuiSensor.h(46) : see declaration of 'INuiAudioBeam'
2>C:\Program Files\Microsoft SDKs\Kinect\v1.5\inc\NuiSensor.h(52): error C2146: syntax error : missing ';' before identifier 'INuiFrameTexture'
2>C:\Program Files\Microsoft SDKs\Kinect\v1.5\inc\NuiSensor.h(52): warning C4091: '' : ignored on left of 'interface' when no variable is declared
2>C:\Program Files\Microsoft SDKs\Kinect\v1.5\inc\NuiSensor.h(58): error C2146: syntax error : missing ';' before identifier 'INuiSensor'
2>C:\Program Files\Microsoft SDKs\Kinect\v1.5\inc\NuiSensor.h(58): warning C4091: '' : ignored on left of 'interface' when no variable is declared
2>C:\Program Files\Microsoft SDKs\Kinect\v1.5\inc\NuiSensor.h(473): error C2371: 'INuiFrameTexture' : redefinition; different basic types
2>          C:\Program Files\Microsoft SDKs\Kinect\v1.5\inc\NuiSensor.h(52) : see declaration of 'INuiFrameTexture'
2>C:\Program Files\Microsoft SDKs\Kinect\v1.5\inc\NuiSensor.h(596): error C2371: 'INuiSensor' : redefinition; different basic types
2>          C:\Program Files\Microsoft SDKs\Kinect\v1.5\inc\NuiSensor.h(58) : see declaration of 'INuiSensor'
2>C:\Program Files\Microsoft SDKs\Kinect\v1.5\inc\NuiSensor.h(684): error C2061: syntax error : identifier 'INuiAudioBeam'
2>C:\Program Files\Microsoft SDKs\Kinect\v1.5\inc\NuiSensor.h(1047): error C2065: 'ppDmo' : undeclared identifier
2>C:\Program Files\Microsoft SDKs\Kinect\v1.5\inc\NuiSensor.h(1047): warning C4229: anachronism used : modifiers on data are ignored
2>C:\Program Files\Microsoft SDKs\Kinect\v1.5\inc\NuiSensor.h(1047): error C2491: 'NuiGetAudioSource' : definition of dllimport data not allowed
2>C:\Program Files\Microsoft SDKs\Kinect\v1.5\inc\NuiSensor.h(1047): fatal error C1903: unable to recover from previous error(s); stopping compilation

參考其他專案後, 證實要加一個

#include <Shlobj.h>

這個到底是什麼鳥? 會對我們的程式有什麼影響, 一概不知...

只能摸著石子繼續過河

http://msdn.microsoft.com/en-us/library/windows/desktop/bb776903(v=vs.85).aspx

 

依照範例的結構, 製成了一個RzKinect類別


	RzKinect(NUI_IMAGE_RESOLUTION depthRes, NUI_IMAGE_RESOLUTION colorRes);

	~RzKinect();

	HRESULT Initialize();
	void frameMove(float frameTime);

 

它在frameMove的時候, 會去WaitForSingleObject


if ( WAIT_OBJECT_0 == WaitForSingleObject(m_hNextColorFrameEvent, 0) )

 

然後我把得到的Pixel塞到Ogre的PixelBox裏, 然後再用


	Ogre::HardwarePixelBufferSharedPtr pixelBuffer = mColorTexture->getBuffer();
	pixelBuffer->blitFromMemory(mColorPixelBox);

 

真正變成Ogre的Texture內容

 

把它放到背景

(中間省略)

 

最後出來這樣:

 

Issues:

1. 為什麼DEPTH和COLOR的輪廓相差不少, 但是在MS的範例裏並沒有那麼明顯..(是解悉度的關係? 還是要用微軟那個很長的FUCTION來取得DEPTH值)

2. 生物的分佈還是不夠均勻...參考PINPIN的FISH

3.範例程式中有NEAR MODE的選項, 為什麼在NUI的文件中沒有看到NEAR MODE 及 Sit Mode的選項?

 

修正後結果:

 

Issues tracker:

1. Depth和Color鏡頭果然存在著特殊的國與國關係, 因為鏡頭的位置和角度不同, MS提供了一個換算的方法讓深度的資訊可以換算出相對應的COLOR PIXEL位置, 對啦, 就是那個很長的NuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution

2. Pinpin的平均分佈會參考魚群散亂在空間的程度, 然後找最近的魚...但我覺得其實不用, 只要在目標圖形上想辦法平均分佈就好了, 所以最後是用掃描的方式, 在固定像素間隔放一隻魚

3. 參考了GreenScreen-D2D, 找到了NuiImageStreamSetImageFrameFlags(NUI_IMAGE_STREAM_FLAG_ENABLE_NEAR_MODE), 連帶的 SKELETON 的 SEAT MODE也可以用NuiSkeletonTrackingEnable加NUI_SKELETON_TRACKING_FLAG_ENABLE_SEATED_SUPPORT來啟用

 

Rz

 

 

 

  Rz     should work (hard)