▶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변수에 저장하게합니다.
결과를 살펴볼까요?
[프로세싱기초예제 비디오 - 색상추적하기]
'시각화 > 프로세싱' 카테고리의 다른 글
| ▶Processing :: 프로세싱 기초예제 – video #4 - 움직임 추적하기 + 원 그리기 (3) | 2014.05.30 | 
|---|---|
| ▶Processing :: 프로세싱 기초예제 – video #3 움직임 감지하기 (5) | 2014.05.29 | 
| ▶Processing :: 프로세싱 기초예제 – video #1 (8) | 2014.05.29 | 
| ▶ Processing :: 프로세싱 기초예제 - 문자열(string)파헤치기 (2) | 2014.05.08 | 
| ▶ Processing :: 프로세싱 기초예제 - 픽셀 (0) | 2014.05.03 |