2017-02-13 104 views
1

我將在我的處理項目中顯示2層(分別來自kinect和mask的深度圖像)。在這個項目中,我將通過使用掩碼來隱藏沒有用戶可用的區域。請注意,「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); 
    } 
+0

當然,只是遍歷邊界像素,並設置其不透明度。哪部分給你帶來麻煩?你可以把一個[mcve]放在一起,試圖在一個硬編碼的圖像而不是電影上做到這一點? –

+0

當然,爲了清晰起見,代碼已被編輯。 –

回答

0

有可以改進的幾件事情:

  1. 無需面具多次加載平局(第二)(一次在設置中就足夠了)
  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(); 
} 
+0

這是一個非常好的解決方案。但是,當我要通過opencv算法過濾userImage時,它似乎忽略了alpha通道。我已經使用下面的代碼來過濾userImage:opencv.loadImage(userImage); opencv.blur(3); blur = opencv.getSnapshot(); image(blur,0,0); –

+0

任何其他解決方案? opencv忽略了alpha通道,所以這個解決方案在這裏不會有效。 –