1

我将在我的处理项目中显示 2 层(分别来自 kinect 的深度图像和蒙版)。在这个项目中,我将使用遮罩隐藏没有用户可用的区域。请注意,“掩码”从我的代码中名为“movie2”的电影中获取像素。
有没有办法通过降低蒙版边框的不透明度来模糊用户的边框?

这是我的代码:

    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);
    }
4

1 回答 1

0

有几点可以改进:

  1. 无需在 draw() 中每秒多次加载遮罩(设置一次就足够了)
  2. 您可以使用mask()函数来应用蒙版
  3. 您可以管理自定义用户图像,其中透明像素用于遮罩,用户像素使用不透明像素,您可以过滤以减少边框(例如ERODE,或BLUR通过filter()

其他注意事项:

  • Processing 的内置模糊可能有点慢,但您可以使用Greg Borensteinn 的 OpenCV for Processing 库,它具有更快的过滤器(模糊、腐蚀)
  • 如果您只检查 userMap 而不需要 x,y 坐标,则可以简单地使用平面循环而不是嵌套循环并获得一点速度。

这是将上述几点说明为代码的尝试,但请记住这是不完整/未经测试的:

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();
}
于 2017-02-14T01:19:35.487 回答