2014-12-04 53 views
0

這是我第一次使用OpenFrameworks。我用它來讓OpenCV的光流與來自OpenNI的用戶掩碼一起工作。所以我不需要骨架。我需要的是來自OpenNI的用戶掩碼。OpenNI通過OpenFrameworks顯示框架但不是用戶掩碼

我使用OpenNI版本1.5.4.0NITE版本1.5.2.21,我在Ubuntu可信賴的。

大部分零件都工作,除了一個:我看不到用戶面具。原生的OpenNI示例有效:我可以在其中看到用戶輪廓。但是從OpenFrameworks,我似乎無法獲得用戶掩碼。

對於我了openFrameworks代碼中的每個用戶,我可以這樣做:

// "user" is an object returned from ofxOpenNI::getTrackedUser 

// This actually displays a skeleton: 
user.drawSkeleton(); 
// These two do nothing: 
user.drawMask(); 
user.drawPointCloud(); 

我想這也是對OpenNI設備的調試視圖真:

// openNiDevice is an instance of ofxOpenNI 
openNiDevice.drawDebug(); 

這顯示了RGB攝像頭和深度相機與骨架,但我不認爲它顯示用戶掩碼。這並不是很清楚,因爲用戶大綱可能被誤認爲是同質深度閱讀,但我不認爲是這樣。我認爲即使在調試屏幕中,用戶遮罩的顏色也不同於深度顏色。

我在畫面上打印屏幕上的用戶數量,我可以告訴ofxOpenNI確實檢測到用戶。此外,它確實顯示骨骼,所以它必須看到東西

同樣,OpenNI示例應用程序Sample-NiUserTracker確實給了我一個完美的輪廓,所以OpenNI必須工作。

我在做什麼錯?

回答

0

我想通了。在用戶掩碼的某處,一個數字被保存爲一個整數,但是被讀爲char。因此,將用戶掩碼的像素保存到一個新數組中,但只保留四個條目中的一個就行了。

基本上這:

const unsigned char * userPix = user.getMaskPixels().getPixels(); 
int dataSize = user.getMaskPixels().getWidth() * user.getMaskPixels().getHeight() * 4; 
unsigned char goodGray[dataSize/4]; 
for (int i = 0; i < dataSize; i += 4) { 
    goodGray[i/4] = userPix[i]; 
} 

goodGray現在包含正確的像素,並且可以用來使ofImage對象。