Sunday, May 8, 2016

Processing กับ Kinect ตอนที่ 1

บทความนี้จะพูดถึงการประยุกต์ใช้งานโปรแกรม Processing กับกล้อง Kinect ซึ่งถือได้ว่าเป็นซอฟต์แวร์และฮาร์ดแวร์ที่ทำงานร่วมกันได้อย่างดีคู่หนึ่ง

ในตอนนี้ เราจะลองติดตั้งโปรแกรมที่เกี่ยวข้อง รวมถึงเริ่มต้นเขียนโค้ดเพื่อแสดงผลตำแหน่งมือขวาของเรา

ผลลัพธ์ที่ได้น่าจะประมาณนี้ครับ โดยวงกลมสีเหลืองก็คือตำแหน่งของมือขวาของเรา ที่ตรวจจับโดย Kinect และวงกลมนี้จะเคลื่อนตามมือของเราครับ



การติดตั้งซอฟต์แวร์ที่เกี่ยวข้อง
  1. Processing (https://processing.org/)
  2. Kinect SDK (https://www.microsoft.com/en-us/download/details.aspx?id=40278)
  3. Kinect4WinSDK หลังจากติดตั้ง Processing แล้ว สามารถเลือกเมนู Sketch/Import Library.../Add Library... แล้วเลือก Kinect4WindSDK
โค้ด
/*
  Hand detection and display
*/
import kinect4WinSDK.Kinect;
import kinect4WinSDK.SkeletonData;
//ref: http://www.magicandlove.com/blog/research/kinect-for-processing-library/

Kinect kinect;
ArrayList <SkeletonData> bodies;

//Set initial graphic properties
void setup()
{
  //set window's size
  size(640, 480);
  //set black background
  background(0);
  //create an instance of Kinect
  kinect = new Kinect(this);
  smooth();
  //arraylist of skeletons
  bodies = new ArrayList<SkeletonData>();
}

//Method to draw graphics, auto refresh
void draw()
{
  background(0);
  //assume only one tracked skeleton
  //right hand detection
  if(bodies.size() != 0) {
    showRightHand(bodies.get(0), Kinect.NUI_SKELETON_POSITION_HAND_RIGHT); 
  }
}

//Method to draw a circle at right hand
void showRightHand(SkeletonData _s, int hand) 
{
  //if hand is tracked
  if (_s.skeletonPositionTrackingState[hand] != Kinect.NUI_SKELETON_POSITION_NOT_TRACKED) 
  {
      //get x and y positions of right hand
      float x = _s.skeletonPositions[hand].x * width;
      float y = _s.skeletonPositions[hand].y * height;
      //draw a yellow circle at hand position
      fill(255,255,0);
      ellipse(x, y, 30, 30);     
   }
}  

//*********************** DO NOT MODIFY ANYTHING BELOW THIS PART ************************
void appearEvent(SkeletonData _s) 
{
  if (_s.trackingState == Kinect.NUI_SKELETON_NOT_TRACKED) 
  {
    return;
  }
  synchronized(bodies) {
    bodies.add(_s);
  }
}

void disappearEvent(SkeletonData _s) 
{
  synchronized(bodies) {
    for (int i=bodies.size ()-1; i>=0; i--) 
    {
      if (_s.dwTrackingID == bodies.get(i).dwTrackingID) 
      {
        bodies.remove(i);
      }
    }
  }
}

void moveEvent(SkeletonData _b, SkeletonData _a) 
{
  if (_a.trackingState == Kinect.NUI_SKELETON_NOT_TRACKED) 
  {
    return;
  }
  synchronized(bodies) {
    for (int i=bodies.size ()-1; i>=0; i--) 
    {
      if (_b.dwTrackingID == bodies.get(i).dwTrackingID) 
      {
        bodies.get(i).copy(_a);
        break;
      }
    }
  }
}

1 comment:

  1. พี่มีช่องทางการติดต่อไหมคะ พอดีกำลังทำโปรเจคเกี่ยวกับเรื่องนี้อยู่ ถ้าพี่มีเวลาว่างรบกวนติดต่อ suchanad_m@hotmail.com หน่อยนะคะ

    ReplyDelete