如何在Processing中减少蒙版(透明图像)边框的不透明度?

时间:2017-02-13 09:37:00

标签: processing transparency blur simple-openni

我将在我的处理项目中显示2层(分别来自kinect和掩码的深度图像)。在这个项目中,我将通过使用掩码来隐藏没有用户可用的区域。请注意,“mask”在我的代码中从名为“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);
    }

1 个答案:

答案 0 :(得分:0)

有一些事情可以改进:

  1. 无需在draw()中多次加载蒙版(一次设置就足够了)
  2. 您可以使用mask()功能应用遮罩
  3. 您可以管理自定义用户图片,其中包含用于屏蔽的透明像素和用于用户像素的不透明像素,您可以对其进行过滤以减少边框(例如ERODEBLUR来自filter()
  4. 其他说明:

    • 处理的内置模糊可能有点慢,但您可以使用具有更快过滤器的Greg Borensteinn's OpenCV for Processing library(模糊,侵蚀)
    • 如果你只是检查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();
    }