除了sceneImage()
,SimpleOpenNI還提供了一個名爲sceneMap()
方法,該方法採用int []作爲輸入。它填充數組中映射到具有與該用戶相對應的編號的特定用戶的值。
例如,如果你沒有用戶,sceneMap陣列將用零填充(例如[0,0,0.....0]
) 如果有1個用戶,一些元件將被填充有1的像素屬於該用戶(例如[0,0,0,1,1,...1,0,0,0,1,0...etc.]
)和等等。
您可以嘗試在PImage中進行一些顏色替換,但這不是很靈活(如果您還啓用了深度貼圖,那麼該怎麼辦?),並且您依賴於每個用戶的硬編碼值(R,B ,G,C,M,Y,這可能是SimpleOpenNI中的順序),所以sceneMap()
是更靈活的選項。
下面是關於如何使用這個註釋過的例子:如果你要滿足多個用戶
import SimpleOpenNI.*;
SimpleOpenNI context;
int[] sceneMap;//this will store data about the scene (bg pixels will be 0, and if there are any users, they will have the value of the user id - e.g. if there are no users, the array will be filled with zeros, if there is one user, some array entries will be equal to 1, etc. the size of the array is the same as the number of pixels in scene image, so it's easy to use with the pixels[] of a PImage
PImage myUserImage;//this is where we'll draw the user
int user1Colour = color(180,130,30);//change to whatever you like
void setup()
{
context = new SimpleOpenNI(this);
context.enableScene();
background(200,0,0);
size(context.sceneWidth() , context.sceneHeight());
//set scene map array
sceneMap = new int[context.sceneWidth()*context.sceneHeight()];
//create the image to draw the user into, by default it will be filled black
myUserImage = createImage(context.sceneWidth() , context.sceneHeight(), RGB);
}
void draw()
{
context.update();
// // gives you a label map, 0 = no person, 0+n = person n - tell OpenNI to update the numbers in the array
context.sceneMap(sceneMap);
//clear myUserImage - fill everything with black
Arrays.fill(myUserImage.pixels,color(0));//We've never used Arrays.fill() before, but all it does is it loops through all elements on an array you pass and sets a value you want for each element - fills an array with a value
for(int i = 0 ; i < myUserImage.pixels.length; i++){
//check if there is a user for the current pixel, if so, use our custom colour for the pixel at this index
if(sceneMap[i] > 0) myUserImage.pixels[i] = user1Colour;
}
myUserImage.updatePixels();
//display image
image(myUserImage,0,0);
}
從長遠來看,這是值得書寫一個基本的實用工具類:
import SimpleOpenNI.*;
SimpleOpenNI context;
SceneMapper sceneMap;
void setup()
{
context = new SimpleOpenNI(this);
context.enableScene();
background(200,0,0);
size(context.sceneWidth() , context.sceneHeight());
sceneMap = new SceneMapper(context);
}
void draw()
{
context.update();
sceneMap.update();
//display image
image(sceneMap.scene,0,0);
}
class SceneMapper{
PImage scene;//this is a PImage where we'll actually draw the user with what colour we want
int[] sceneMap;//this will store scene data - an array of ints which has the same length as context.sceneImage().pixels, the only difference is, sceneImage already has colours set, while scene map has numbers representing user(1,2,3etc.) on top of background(0s)
int numPixels;//total number of pixels, we only store it so we can reuse it
color bg;//background colour
color[] users = {color(255),color(192),color(127),color(64),color(32)};//fill colours for users
SceneMapper(SimpleOpenNI context){
numPixels = context.sceneWidth()*context.sceneHeight();
sceneMap = new int[numPixels];//init scene nap array
scene = createImage(context.sceneWidth(), context.sceneHeight(), RGB);//create a PImage to display scene data
scene.loadPixels();
bg = color(0);
}
void update(){
context.sceneMap(sceneMap);//ask SimpleOpenNI to store scene map data into our array
Arrays.fill(scene.pixels, bg);//clear the image - fill it with the background colours
for(int i = 0 ; i < numPixels ; i++){//loop through all pixels
for(int u = 0 ; u < users.length; u++){//loop through user colours
if(sceneMap[i] > 0) scene.pixels[i] = users[u];//if there are user pixels, use set user colour for those pixels (e.g. pixels with value 1 will use colours stored in users[0], pixels with value 2 will use colour from users[1], etc.)
}
}
scene.updatePixels();//we've use pixels, so update the image at the end
}
}
但這取決於學生是否熟悉課程,並且考慮到它是MFA,對於清潔代碼的壓力更小,並且我承擔的工作壓力更大。
[題外話]:什麼MFA是什麼? :) –
有一些混亂的事情:(「期望的最終遊戲是每個深度圖。」 - 你的意思是深度圖或sceneMap?),「使每個用戶SimpleOpenNI會出現分化」 - 每個用戶在默認情況下是有區別的 - 你的意思是每個用戶的顏色不同的自定義色調/獨立於深度?此外,您應該在調用image()之前調用tint() –
您可以使用Java編程Kinect?!?????????????我每天都會學到一件新東西 –