시각화/프로세싱

▶Processing :: 프로세싱 기초예제 – video #2

비주얼라이즈 2014. 5. 29. 02:48



Processing :: 프로세싱 기초예제 – video #2



'시각화'에서 비디오를 다루는 것 만큼 재미있는 것은 없지요^^

오늘은 지난 포스팅에 이어서 <프로세싱에서의 video다루기>를 살펴보겠습니다.


프로세싱 기초예제 video #1 바로가기





그럼 시작해보겠습니다.





import processing.video.*;

가장 먼저 잊지말고 해야할 부분이지요~

프로세싱의 비디오 라이브러리를 로드해줍니다.



Capture cam;
color trackColor;


그 다음으로는

캡처를 하기위한 'cam' 변수와

색상을 찾을 때 이용할 'trackColor'변수를 만들어줍니다.







다음으로 setup()부분을 먼저 살펴보겠습니다




void setup(){
  size(640, 480);
  trackColor = color(255, 0, 0); // 추적하고자하는 색상을 red로 설정하는 부분
  String[] cameras = Capture.list();
 
  if(cameras.length == 0){
    println("There are no cameras available for captrue.");
    exit();
  } else {
    println("Available cameras");
    for(int i = 0; i < cameras.length; i++){
      println(cameras[i]);
    }
   
    cam = new Capture(this, cameras[0]);
    cam.start();
  }
}



여기까지는 지난 video 기초예제#1과 크게 다르지 않습니다.

trackColor부분이 추가되었다는 것 말고는 동일한 형태입니다.





그럼 이제 draw()부분으로 넘어가보겠습니다.





void draw(){
  //available()함수로 이미지 존재유무에따라 '참/거짓'을 반환하기
  if(cam.available() == true) {
    cam.read(); // 참이라면, 캡쳐한 정보를 가져오기
  }
 
//  tint(mouseX, mouseY, 255);
  cam.loadPixels(); // cam의 픽셀정보를 가져오기
  image(cam, 0, 0); // cam을 출력하는 부분
//  image(cam, 0, 0, mouseX, mouseY);
// 가장 가짜운 픽셀의 '세계기록'을 높은 수치로 설정하기!
// 이는 첫번째 픽셀을 쉽게 이기기 위함이다.
float worldRecord = 500;
 
  int closetX = 0;
  int closetY = 0;
 
  //여기서부터 모든 픽셀을 훑어내려가는 부분!
  for(int x = 0; x < cam.width; x++){ // x는 0부터 cam의 width값까지
    for(int y = 0; y < cam.height; y++){ // y는 0부터 cam의 height값까지
      int loc = x+y * cam.width;
     
      // 현재의 색상!
      color currentColor = cam.pixels[loc];
      float r1 = red(currentColor);
      float g1 = green(currentColor);
      float b1 = blue(currentColor);
     
      float r2 = red(trackColor);
      float g2 = green(trackColor);
      float b2 = blue(trackColor);
     
      // 색상비교를위해 유클리드 함수를 사용합니다.
      float d = dist(r1, g1, b1, r2, g2, b2);
     
      //만약! 현재색상이 가장 가까운 색상보다 추적한 색상에 가깝다면,
      // 현재의 장소와 다른 정도를 저장합니다.
      if(d < worldRecord){
       
        worldRecord = d;
        closetX = x;
        closetY = y;
      }
    }
  }
  //아래의 if함수로인해 색 차이값이 10이하인 부분에만 적용됩니다.
  if(worldRecord < 10){
   
    fill(trackColor);
    strokeWeight(4.0);
    stroke(0);
    ellipse(closetX, closetY, 16, 16);
  }
 
}


꽤 길지요?ㅎㅎ

그래서 중간중간에 주석을 달아두었습니다.


아직 끝은 아닙니다^^;

조금만 더 가보겠습니다.





void mousePressed(){
  int loc = mouseX + mouseY * cam.width;
  trackColor = cam.pixels[loc];
}


mousePressed()함수를 사용하여

클릭한 지점의 픽셀이 가지고 있는 색상값을 track변수에 저장하게합니다.











결과를 살펴볼까요?










[프로세싱기초예제 비디오 - 색상추적하기]