2017-02-13 4 views
1

Ich werde 2 Schichten (Tiefenbild von Kinect bzw. eine Maske) in meinem Bearbeitungsprojekt zeigen. In diesem Projekt werde ich Bereiche, für die kein Benutzer verfügbar ist, mithilfe einer Maske ausblenden. Beachten Sie, dass "mask" seine Pixel aus einem Film namens "movie2" in meinem Code bezieht.
Gibt es eine Möglichkeit, Ränder von Benutzern zu verwischen, indem die Deckkraft von Maskenrahmen reduziert wird?Wie kann die Deckkraft von Masken (transparentes Bild) in Processing reduziert werden?

Hier ist mein Code:

import SimpleOpenNI.*; 
PImage mask,depth; 
SimpleOpenNI kinect; 
int[] userMap; 

void setup(){ 
    kinect = new SimpleOpenNI(this); 
    size(640,480); 
    kinect.enableDepth(); 
    kinect.enableUser(); 
     } 

     void draw(){ 
     kinect.update(); 
     depth=kinect.depthImage(); 
     userMap = kinect.userMap(); 
     image(depth,0,0); 
     mask=loadImage("mask.jpg"); 
     mask.loadPixels(); 
    for (int y=0; y<480; y++) { 
      for (int x=0; x<640; x++) { 
      int index = x + y *640; 
      if (userMap[index]!= 0) { 
      mask.pixels[index]=color(0,0,0,0); 
      } 
      } 
     } 
     mask.updatePixels(); 
     image(mask,0,0); 
    } 
+0

Sicher, iterieren nur die Randpixel und setzen ihre Opazität. Welcher Teil davon gibt dir Ärger? Kannst du eine [mcve] zusammenstellen, die das auf einem einzigen fest codierten Bild anstelle eines Films versucht? –

+0

Sicher, der Code wurde aus Gründen der Übersichtlichkeit bearbeitet. –

Antwort

0

Es gibt ein paar Dinge, die verbessert werden könnten:

  1. keine Notwendigkeit, die Maske mehrere Male pro Sekunde in Draw zu laden() (einmal im Setup wird genug sein)
  2. Sie können die mask() Funktion verwenden, um eine Maske anzuwenden
  3. Sie können verwalten benutzerdefiniertes Benutzerbild mit transparenten Pixeln zum Maskieren und undurchsichtige Pixel für Benutzerpixel, die gefiltert werden können, um die Grenze zu reduzieren (z. Wenn Sie

Sonstige Hinweise Wenn Sie nur die userMap überprüfen und keine x, y-Koordinaten benötigen, können Sie einfach eine flache Schleife anstelle einer verschachtelten Schleife verwenden und ein wenig Geschwindigkeit gewinnen.

Hier ist ein Stich an, welches die Punkte oben als Code, aber daran denkt, diese unvollständig/ungetestet:

import processing.video.*; 

class effect2{ 
    PImage mask; 

    int[] userMap; 
    PImage userImage; 

    int numPixels; 

    effect2(){ 
    //movie2 = new Movie(this,"MOVIE_2_PATH_HERE");//might be initialised somewhere 
    movie2.play(); 
    //initialize image once 
    userImage = createImage(640,480,ARGB); 
    userImage.loadPixels(); 

    numPixels = userImage.width * userImage.height; 

    userMap = new int[numPixels]; 
    } 

    void drawing(){ 
    //kinect.update(); is called at some point 

    image(depth,0,0); 

    //update user map 
    kinect.userMap(userMap); 
    //update user image based on user map 
    //flat (1D) for loop is faster than nested (2D) for loop 
    for(int i = 0; i < numPixels; i++){ 
     if (userMap[i] == 0) { 
      userImage.pixels[i] = 0x00000000;//transparent black 
     }else{ 
      userImage.pixels[i] = 0xFFFFFFFF;//opaque white 
     } 
    } 
    userImage.updatePixels(); 

    //filter/blur as needed 
    //I recommend using https://github.com/atduskgreg/opencv-processing for faster blur (and other filters) 
    userImage.filter(BLUR,2); 

    //apply mask 
    movie2.mask(userImage,0,0); 

    //preview mask 
    image(userImage,0,0,64,48); 
    } 

} 
//the movie is updated too 
void movieEvent(Movie m){ 
    m.read(); 
} 
+0

Dies ist eine sehr schöne Lösung. Wenn ich UserImage nach opencv-Algorithmus filtere, scheint es jedoch, dass es die Alpha-Kanäle ignoriert. Ich habe den folgenden Code verwendet, um userImage zu filtern: opencv.loadImage (userImage); opencv.blur (3); blur = opencv.getSnapshot(); Bild (Unschärfe, 0,0); –

+0

eine andere Lösung? opencv ignoriert den Alphakanal, daher wäre diese Lösung hier nicht effektiv. –

Verwandte Themen