【问题标题】:how to reduce opacity of mask(transparent image) borders in Processing?如何在处理中减少遮罩(透明图像)边框的不透明度?
【发布时间】:2017-07-01 05:58:42
【问题描述】:

我将在我的处理项目中显示 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);
    }

【问题讨论】:

  • 当然,只需遍历边界像素并设置它们的不透明度。哪一部分给你带来了麻烦?你能把 minimal reproducible example 放在一起,尝试在单个硬编码图像而不是电影上做到这一点吗?
  • 当然,为了清楚起见,代码已被编辑..

标签: processing transparency blur simple-openni


【解决方案1】:

有几点可以改进:

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

其他说明:

  • 处理的内置模糊可能有点慢,但您可以使用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();
}

【讨论】:

  • 这是一个非常好的解决方案。但是,当我要通过 opencv 算法过滤 userImage 时,它​​似乎忽略了 alpha 通道。我使用以下代码过滤 userImage: opencv.loadImage(userImage); opencv.blur(3);模糊 = opencv.getSnapshot();图像(模糊,0,0);
  • 还有其他解决方案吗? opencv 忽略了 alpha 通道,所以这个解决方案在这里不会有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 2017-02-02
相关资源
最近更新 更多