とは別に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 を考えると、きれいなコードへのプレッシャーは少なくなり、物事を成し遂げるためのプレッシャーはより大きくなると思います。