시각화/프로세싱

▶Processing :: 프로세싱 기초예제 – video #5 : blobDetction라이브러리

비주얼라이즈 2014. 6. 3. 15:56



Processing :: 프로세싱 기초예제 – video #5 : blobDetction라이브러리




안녕하세요

오늘은 video예제에 이어서

응용해서 공부해볼만한 라이브러리를 소개하고자합니다.






blobDetection 라이브러리를 이용하면

위 영상처럼 재미있는 시각화를 만들 수 있습니다.







[오늘 포스팅에서 살펴볼 blobDetection 라이브러리][각주:1]





import processing.video.*;
import blobDetection.*;

먼저 프로세싱 비디오라이브러리와

다운받은 blobDetection라이브러리를 로드합니다.




Capture cam;
BlobDetection theBlobDetection;
PImage img;
boolean newFrame=false;

새로 설치한 BlobDetection 라이브러리말고는

PImageboolean은 그동안의 예제에서 다뤄왔었습니다.




void setup(){
 
  size(640, 480);
  cam = new Capture(this, 40*4, 30*4, 30);
     
     cam.start();
       
  // BlobDetection
 
  img = new PImage(80,60);
  theBlobDetection = new BlobDetection(img.width, img.height);
  theBlobDetection.setPosDiscrimination(true);
  theBlobDetection.setThreshold(0.2f); // will detect bright areas whose luminosity > 0.2f;
}

Threshold의 사전적정의는 '임계값'입니다.

theBlobDetection.setThreshold(밝기값)의 형태로 설정해주게됩니다.






void captureEvent(Capture cam){
  cam.read();
  newFrame = true;
}
captureEvent();함수는, 카메라가 새로운 프레임에 접근가능할 때 호출하는 역할을 합니다.
void draw(){
 
  if (newFrame)  {
  newFrame=false;
  image(cam,0,0,width,height);
  img.copy(cam, 0, 0, cam.width, cam.height, 0, 0, img.width, img.height);
  fastblur(img, 2);
  theBlobDetection.computeBlobs(img.pixels);
  drawBlobsAndEdges(true,true);
  }
}


만약 새로운 프레임이 있다면

영상을 출력하고, 이미지 파일로 영상을 복사합니다.

compute의 사전적 적의는 '계산'이며, Blob'얼룩'을 뜻합니다.

따라서 theBlobsDetection.computeBlobs(img.pixels);

이미지의 픽셀에서 얼룩을 계산하라는 뜻이겠지요?



blobs기능과 Edges기능의 적용여부를 여기서 설정해줄 수 있습니다.

(true면 설정하고, false면 설정하지 않습니다.)





drawBlobsAndEdges는 이름 그대로

BlobEdge를그리는 부분입니다.


drawBlobsAndEdges는 두개의 boolean값을받고 있는데

이것으로BlobsEdges의 적용여부를 설정할 수 있습니다.


strokeWeight로선의 굵기를 설정하고

색상은green으로 설정한 모습입니다.(R, G, B)




void fastblur(Pimage img,int radius){
 if (radius<1){
    return;
  }
  int w=img.width;
  int h=img.height;
  int 즈=w-1;
  int hm=h-1;
  int wh=w*h;
  int div=radius+radius+1;
  int r[]=new int[wh];
  int g[]=new int[wh];
  int b[]=new int[wh];
  int rsum,gsum,bsum,x,y,I,p,p1,p2,yp,yi,yw;
  int vmin[] = new int[max(w,h)];
  int vmax[] = new int[max(w,h)];
  int[] pix=img.pixels;
  int dv[]=new int[256*div];
  
  for (i=0;i<256*div;i++){
    dv[i]=(i/div);
  }
  yw=yi=0;
  for (y=0;y>16;
      gsum+=(p & 0x00ff00)>>8;
      bsum+= p & 0x0000ff;
    }
    for (x=0;x>16;
      gsum+=((p1 & 0x00ff00)-(p2 &
0x00ff00))>>8;
      bsum+= (p1 & 0x0000ff)-(p2 &
0x0000ff);
      yi++;
    }
    yw+=w;
  }

마지막으로 fastblur부분입니다.

RGB색상을 바탕으로 다양한 설정을 하게됩니다.








결과영상을 살펴보겠습니다.





  1. Super Fast Blur v1.1 by Mario Klingemann [본문으로]