Skip to content

Make Processing

조회 수 3529 추천 수 0 댓글 6
Atachment
첨부파일 '3'
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print

kinect-review-hed-rm-eng-600.jpg


최근 고창선 작가의 작품에 참여 하게 되었다.


최근(?)에 이슈가 되고 있는 키넥트 장비이다. 솔직히 게임에는 큰 관심이 없어서. 이런것이 있구나 정도 였는데, 프로그램 제작 의뢰를 받고 자료를 찾아 보니 많은 자료들이 있었다. 마이크로 소프트 사에서 제공되는 키넥스 SDK를 사용하면 생각하지도 못한 강력한 인풋 디바이스가 되는 것이다.. 하지만 프로세싱에서는 SDK 만큼 완벽한 라이블러리가 없는 것이 현실이다.


우선 작년 부터 알고 있던 라이블러리는 다니엘 쉐프만 선생님이 만드신 라이블러리 이다.프랫에 있을때 한 학생에게 라이블러리 있으니 사용해 보라고는 했지만 개인적으로 적용 시켜 본적은 없었다.


Kinect Point Cloud demo in Processing from shiffman on Vimeo.


맥(10.7.3)에서 예제 파일을 테스트 해보니 잘 되다가 다운 증상이 가끔 생겨서 다른 라이블러리를 서치 했다.


그중에서 가장 간단하 소스로 되어 있는.


https://github.com/nrocy/processing-openkinect


(맥전용 라이블러리이다.)

을 찾을 수 있었다.


 import king.kinect.*;

PImage img, depth;

void setup()
{
  size(1280, 480);
  
  NativeKinect.init();
  NativeKinect.start();
  
  img = createImage(640,480,RGB);
  depth = createImage(640,480,RGB);
}

void draw()
{
  img.pixels = NativeKinect.getVideo();  // 원본 영상 받기
  img.updatePixels();
  image(img,0,0,640,480);

  depth.pixels = NativeKinect.getDepthMap();  // 깊이 영상 받기
  depth.updatePixels();
  image(depth,640,0,640,480);
}


간단하게 실제 영상과 depth 영상을 가져 올 수 있게되어 있었다.


정확한 수치로 값들이 들어오는 것은 아니지만 문득 드는 생각이 오픈 CV랑 붙이면 depth값을 객체로 인식해서

위치를 잡을 수 있을 것으로 생각하고 오픈 CV와 연동하기로 했다.만약 된다면.


수많은 객체의 위치값을 배경에 영향 받지 않고 받아 올 수 있게 되는 것이다. 그러면 캠을 사용해서 사람들의 위치나 특정 물체를 인식하는 것이 너무나 쉽게 구현 가능해지는 것이다. 야호~~


screenshot_01.png


위의 이미지는 키넥트를 연결했을 때의 영상이다 왼쪽에는 원본영상(지저분해 보여서 오른쪽만 캡쳐 ㅜㅜ) 오른쪽에서는 위와 같이 depth 영역별 이미지를 얻을수 있다.~ 



이제 할일은 키넥트에서 받은 depth 영상을 openCV 에서 받아서 depth 영상에서 보이는 미묘한 흑백 이미지의 밝기를 blobs() 함수로 처리해서 나누면 된다.


screenshot_02.png


위의 이미지 처럼 각영역별로 depth 값을 나눈 부분을 인식하는 것이다.


프로그램 구동 영상

openCV with Kinect on Processing from smileblue on Vimeo.





소스는 아래와 같다.


import king.kinect.*;   // 키넥트 라이블러리

import hypermedia.video.*;  // openCV 라이블러리
import java.awt.*;

OpenCV opencv;

PImage img, depth;   //

int w = 640;  // 키넥트 영상 가로 사이즈
int h = 480;  // 키넥트 영상 세로 사이즈
int threshold = 80;  // 감지할 영역 값

boolean preview = true;
boolean start = false;

int point_s_x =  200;  // 인식 된 화면의 x 위치값
int point_s_y =  150;  // 인식 된 화면의 y 위치값

float Pxpos[];  // 인식된 포인트 좌표
float Pypos[];

int blobs_num = 0;  // 인식된 객체수

void setup()
{
  size(1024, 768);

  NativeKinect.init();
  NativeKinect.start();

  img = createImage(640, 480, RGB);
  depth = createImage(640, 480, RGB); 

  opencv = new OpenCV( this );
  opencv.allocate(w, h);

  noStroke();
  noFill();

}

void draw()
{
  background(255);

  depth.pixels = NativeKinect.getDepthMap();
  depth.updatePixels();

  opencv.copy(depth);  // 키넥트로 부터 받은 영상을 open CV에 넣어줌
  opencv.absDiff();
  opencv.threshold(threshold);
  if (start == false)
  {
    image( opencv.image(OpenCV.GRAY), point_s_x, point_s_y);
  }
  Blob[] blobs = opencv.blobs( 100, w*h/3, 20, true );

  Pxpos = new float[blobs.length];
  Pypos = new float[blobs.length];

  blobs_num = blobs.length;
  for ( int i=0; i<blobs.length; i++ )
  {
    Rectangle bounding_rect = blobs[i].rectangle;
    float area = blobs[i].area;
    float circumference = blobs[i].length;
    Point centroid = blobs[i].centroid;
    Point[] points = blobs[i].points;

    Pxpos[i] = centroid.x*1.6;
    Pypos[i] = centroid.y*1.6;
    if (start == false)
    {
      noFill();
      stroke( blobs[i].isHole ? 128 : 64 );
      rect( point_s_x+bounding_rect.x, point_s_y+bounding_rect.y, bounding_rect.width, bounding_rect.height );
      stroke(255, 0, 255);
      line( point_s_x+centroid.x-5, point_s_y+centroid.y, point_s_x+centroid.x+5, point_s_y+centroid.y );
      line( point_s_x+centroid.x, point_s_y+centroid.y-5, point_s_x+centroid.x, point_s_y+centroid.y+5 );
    }
  }

  if (start == true)
  {
    fill(#ffcc33, 125);
    for (int i = 0; i< blobs.length; i++)
    {
      ellipse(Pxpos[i], Pypos[i], 10, 10);
      println(Pxpos[0] + "      " + Pxpos[0]);
    }
  }

  if (preview == true)
  {
    img.pixels = NativeKinect.getVideo();
    img.updatePixels();
    image(img, 0, 0, 200, 150);
  }
}

void keyPressed() {
  if ( key=='p' )
  {
    if (preview == true)
    {
      preview = false;
    }
    else
    {
      preview = true;
    }
  }
  if ( key=='s' )
  {
    if (start == true)
    {
      start = false;
    }
    else
    {
      start = true;
    }
  }
}

void mouseDragged() {
  threshold = int( map(mouseX, 0, width, 0, 255) );
}

public void stop() {
  opencv.stop();
  super.stop();
}



키보드 설정

//////////////////////////////////

1. 'p' 프리뷰 키고 끄기

2. 's' 트래킹 포인트 키고 끄기

3. 마우스 드래그로 인식 레인지 설정

//////////////////////////////////



웹캠을 사용할때는 openCV 를 이용하더라도 배경과 조명 밝기에 영향을 받을수 밖에 없었다. 하지만 키넥트는 배경과 상관없이 깊이 값으로 객체를 인식하기 때문에 오류부분을 최소화 할수 있다. 늦게 나마 적용 시켜 보았지만 키넥트의 응용 범위가 상당히 넓을 것 같다.


그리고 멀티로 인식도 가능하다.....끄~~~~읕~~~~


TAG •
  • profile
    봉구르 2013.01.11 11:59

    질문이있습니다...키넥트를 알아보니 키넥트 for 마이크로소프트 / 윈도우
    이런식으로 나와있던데 위의 소스대로면 맥에서도 상관없이 인식을 하나요?

     

  • profile
    smileblue 2013.01.11 12:48
    넵^^ 맥환경에서 테스트 한것입니다. 더 좋은 라리블러리가 많기는 하지만 쉽게 구현해 봤어요~~ 키넥트 구입하실때 키넥트와 연결하는 USB 케이블도 있는지 체크하세요~~
  • profile
    봉구르 2013.01.12 01:07
    이렇게나 빠른 답변을...ㅠㅠ감사합니다~~
  • profile
    봉구르 2013.01.12 15:49
    아...드라이브설치가 먼저였는데 딴짓만했네요...ㅠㅠ
    GITHUB라는걸 설치를했는데 그래도 키넥트를 인식을 못하는게...;;;
    아...전 바보였나봐요...ㅠ
  • profile
    smileblue 2013.01.13 02:21
    별도의 드라이버 설치 없이 openCV설치와 openCV라이블러리 설치 그리고 키넥트 라이블러리 설치 3가지만 하시면 됩니다...가까이 있으면 도와 드릴텐데 ㅜㅜ 다시 한번 openCV 설치부터 차근 차근..해보세요~~ 화이팅!!
  • ?
    인터랙 2015.05.23 22:31
    프로세싱과 연동되는 모델은 1414라고 하던데 최근에 나온 모델은 연동이 안되나봐요..? 맞나요?

라이블러리 | library

라이블러리 활용하기

  1. pUI(A Graphical User Interface Library for Processing) 인터페이스 라이블러리

    https://github.com/martinleopold/pUI 인터페이스 빌더가 없나 검색하다가 찾은 인터페이스 라이블러 입니다. 사용해 보지는 않았는데 급할때는 이것도 나쁘지 않을 듯 합니다.~~
    Date2014.03.18 Bysmileblue Reply0 Views943
    Read More
  2. OpenCV for Processing 새로나온 openCV 라이블러리

    https://github.com/atduskgreg/opencv-processing 새로운 프로세싱 라이블러리가 나왔습니다..(약 6개월전에 알파버전이 릴리즈 되었습니다.) openCV란 computer vision 라이블러리로 이미지나 카메라로 부터 가져온 이미지 또는 영상을 처리해서 사람...
    Date2014.01.04 Bysmileblue Reply1 Views1774
    Read More
  3. SVG 파일 출력 라이블러리 Wordcram.org

    프로세싱에서 PDF 출력을 기본 라이블러리로 지원되긴 하지만. 이것이 진정한 벡터!!출력!!! http://wordcram.org/
    Date2013.11.26 Bysmileblue Reply0 Views887
    Read More
  4. [링크] unfolding - 지도를 가지고 인터렉션 작업을 할수 있는 라이브러리..

    http://unfoldingmaps.org/
    Date2013.10.09 Bysmileblue Reply0 Views1571
    Read More
  5. 드래그 엔 드롭 라이브러리 sDrop

    현재 상용화 되어 있는 프로그램의 가장 기본적인 프로그램 기능은 Drag and Drop 이다. 말그대로 끌어다가 넣으면 실행되거나 파일을 로드할 수 있는 기능을 말한다. 이러한 기능을 프로세싱에서는 어떻게 구현 할까? 친절하게도 이런 기능을 라이블러리...
    Date2013.02.28 Bysmileblue Reply1 Views1417
    Read More
  6. PDF 파일 출력

    프로세싱에는 9개의 내장 라이블러리가 있다. 라이블러리는 프로세싱 프로그램에 설치 또는 복사해서 프로세싱의 기능을 확장 시키는 기능을 하게 된다. 그 중 PDF 라이블러리는 프로세싱 기본 라이블러리로 PDF 문서 파일 형식으로 데이터를 출력할...
    Date2012.07.11 Byblue Reply0 Views1538
    Read More
  7. 키넥트와 오픈 CV (Kinect with Open CV)

    최근 고창선 작가의 작품에 참여 하게 되었다. 최근(?)에 이슈가 되고 있는 키넥트 장비이다. 솔직히 게임에는 큰 관심이 없어서. 이런것이 있구나 정도 였는데, 프로그램 제작 의뢰를 받고 자료를 찾아 보니 많은 자료들이 있었다. 마이크로 소...
    Date2012.06.12 Bysmileblue Reply6 Views3529
    Read More
Board Pagination ‹ Prev 1 Next ›
/ 1

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Copyright (c) 2012 Make Processing. All Right Reserved.

smileblue

sketchbook5, 스케치북5

sketchbook5, 스케치북5

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소