摘要: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來啟用
![]() |
|





