13 มิถุนายน 2553

SURF Speeded Up Robust Features

SURF Speeded Up Robust Features
เป็น feature  ที่ได้รับแรงบันดาลใจมากจา SIFT โดยการใช้ Haar Wavelet มาใช้
ถูกนำเสนอในปี 2006 เป็นเป็น ฟังก์ชันใหม่ที่มีมาใน OpenCV 2.0 และ IVT
อ่าน Paper เพิ่มเติม
อ่าน wiki

Integration Vision Toolkit ทูลคิดสำหร...

Integration Vision Toolkit ทูลคิดสำหรับวิชั่นที่มีพื้นฐานมาจาก OpencV

เป็นไรบารีสำหรับ Computer Vision อีกตัวที่หน้าสนใจ
มาจากทางฝั่งเยอรมัน ที่สำคัญมันมีหนังสือให้อ่าน 1 เล่น อย่างนี้พอสูสีกับ OpenCV หน่อย
เพราะถ้ามีมาให้แต่ library ก็ใช้ไม่เป็นอยู่ดี
http://ivt.sourceforge.net/book.html

สำหรับตัวอย่าง ถึงแม้จะมีน้อยกว่าของ OpenCV
แต่ก็เป็นตัวอย่างที่ดี มี Plattern การเขียนที่น่านำมาเป็นตัวอย่าง
เช่นการทำ fillter การใช้ SURF เพิ่งรู้จักครั้งแรกจากการอ่าน ข้อมูลใน Sample นี่แหละ
http://ivt.sourceforge.net/examples.html


จุดเด่นอีกอย่างก็คือ มีการจัดไลบารี เป็น class แบบ C++ คล้ายกับใน OpenCV 2.0
แต่จากที่ลองมีการจัดเรียงที่ดีกว่ามาก เพราะเริ่มเขียนแบบนี้ตั้งแต่แรกเริ่ม

นอกจากนี้เค้ายังอ้างว่า เร็วกว่า OpenCV ในหลายๆด้าน
  • Undistortion (faster by a factor of 4 compared to cvCalibFilter from the OpenCV)
  • Combined Rectification/Undistortion (faster by a factor of 8 compared to cvCalibFilter from the OpenCV)
  • Harris Corner Detector (faster by a factor of 1.4 compared to the OpenCV implementation)
  • SIFT Features and kd-tree feature matching
  • Calibration: fully integrated single and stereo camera model (compatible with OpenCV calibration)
  • Many filters, resize, Bayer2RGB, RGB2HSV, SVD, PCA, Linear Least Squares, drawing, ...
  • POSIT (pose estimation on the basis of 2D-3D point correspondences)
  • Core function of the ICP (pose estimation on the basis of 3D-3D point correspondences

ใครสนใจเข้าไปโหลดมาลองเล่นได้ที่
http://ivt.sourceforge.net/index.html

ปล. ตัวอย่าง Fast Harris-SIFT features / kd-tree matching / RANSAC ผมรันไม่ผ่าน ใครรันได้ช่วยบอกวิธีด้วยนะครับ

11 มิถุนายน 2553

สรุปหุ่นยนต์เล่นลูกบิด

สรุปหุ่นยนต์เล่นลูกบิด
วันเสาร์ที่จะถึงนี้ได้รับมอบหมายให้นำหุ่นยนต์ที่สามารถเล่นลูกบิดได้
ไปโชว์ที่งานถนนเทคโนโลยี ก็เลยต้องทำสรุปหลักการการทำงานของหุ่นยนต์คร่าวๆ

หัวข้อโครงงาน เดอะเทอร์มิเนเตอร์: หุ่นยนต์แก้ปัญหาลูกบิด
                          (The Terminator: Robotic Rubik Solver)

ผู้วิจัย : นายเนมินทร์ สุขเสน นายสรุจ พันธุ์จันทร์ นายนวคุณ ศรีบาง นายทินกร ภูสีดิน และนายศุภชัย ไชยสงคราม

อาจารย์ที่ปรึกษา : รศ.ดร.สยาม เจริญเสียง และดร.อาบทิพย์ ธีรวงศ์กิจ

 


บทนำ

ลูกบิดเป็นเกมการละเล่นที่สนุกสนานมีส่วนช่วยในการพัฒนาสมองของผู้เล่น ซึ่งการพัฒนาหุ่นยนต์ให้สามารถเล่นลูกบิดเช่นเดียวกับมนุษย์ได้นั้นมีส่วนประกอบดังต่อไปนี้ ระบบวิชันทำหน้าที่เสมือนดวงตา ระบบคอมพิวเตอร์ทำหน้าที่เสมือนสมอง ระบบแขนกลทำหน้าที่เสมือนแขนและนิ้วมือ จากการทดลอง หุ่นยนต์สามารถทำงานได้ถูกต้อง และเล่นลูกบิดได้เสร็จภายในเวลา 14 นาที

ปัญหา

ลูกบิดขนาด 3x3x3 รูปทรงสี่เหลี่ยมจะมีทั้งหมด 6 หน้าด้วยกัน แต่ละหน้าหมุนได้ 3 แบบรวม 18 แบบทำให้ลูกบิดสามารถสลับสับเปลี่ยนหน้าได้ถึง 8!x38x12!x210 แบบหรือประมาณ 43 ล้านล้านล้านแบบ

แนวทางการวิจัย

ทีมงานได้ออกแบบแขนกลที่มีองศาอิสระ 4 องศาเคลื่อนที่อยู่บนระนาบ 2 มิติ ที่ปลายแขนกลติดตั้งกริปเปอร์ซึ่งสามารถหมุน และจับลูกบิดได้ จากรูปร่างที่ออกแบบนี้เองทำให้ตัวแขนกลสามารถเข้าถึงลูกบิดได้ 2 หน้า กระบวนการที่หุ่นยนต์ใช้แก้ปัญหาลูกบิดประกอบด้วนขั้นตอน 3 ขั้นตอนดังนี้

1.        อ่านสีทั้ง 6 หน้าของลูกบิดด้วยระบบวิชัน

2.        ประมวลผลรูปแบบการบิด ด้วยระบบคอมพิวเตอร์ ซึ่งจะได้ท่าทางในการบิดประมาณ 100 ครั้ง

3.        เมื่อได้ท่าทางในการบิดและหน้าที่บิดต้องทำการหมุนหน้านั้นให้มาอยู่หน้าที่แขนกลสามารถเข้าถึงได

4.        ทำซ้ำข้อ 3 จนกระทั่งการบิดเสร็จสิ้น

                 


ผลที่คาดหมาย

หุ่นยนต์สามารถแก้ปัญหาลูกบิดได้โดยอัตโนมัติ อย่างถูกต้อง

เอกสารอ้างอิง

 [1] Craig, J.J., Introduction to robotics: mechanics and control. 2004: Prentice Hall.

[2] Corke, P.I., A Robotics Toolbox for MATLAB. IEEE Robotics and Automation Magazine, 1996. 3: p. 24-32


ดาวน์โหลด PDF ได้ที่นี่


 


ทดลองฉายภาพจากโปรเจ็คเตอร์ลงบนภาพ 3 มิติ

ทดลองฉายภาพจากโปรเจ็คเตอร์ลงบนภาพ 3 มิติ

จัดองค์ประกอบการทดลองดังนี้
ระยะระหว่างกล่องถึงprojector 110 ซม.
พารามิเตอร์ของ projector คือ
    fovy =33.5
    อัตราส่วน 4/3
    อยู่ห่างจากวัตถุ 190 ซม.
   

ได้ sourc code ดังนี้
#include <GL/glut.h>
void init(void)
{
    //glEnable (GL_DEPTH_TEST); //enable the depth testing
 //   glEnable (GL_LIGHTING); //enable the lighting
 //   glEnable (GL_LIGHT0); //enable LIGHT0, our Diffuse Light
 //   glShadeModel (GL_SMOOTH); //set the shader to smooth shader
    
    glClearColor (0.0, 0.0, 0.0, 0.0);

    glShadeModel (GL_FLAT);
    


    glMatrixMode (GL_PROJECTION);
    glLoadIdentity ();
    gluPerspective(33.5, 4.0/3.0, 140.0, 190);

}
void cube (void) {
    float i;
    for (
i=0;i<50;i++)
    {
    glTranslated(1, 0, 1);
    glPushMatrix();
    glutSolidCube(2); //draw the cube
    glPopMatrix();
    }
}
void display(void)
{
        glMatrixMode(GL_MODELVIEW);
    glLoadIdentity ();
    gluLookAt
    (
        0.0, 0.0, 190.0,/* camera */
        0.0, 0.0, 0.0,    /* lens towards */
        0.0, 1.0, 0.0   /* up-vector */
    );
    glClear (GL_COLOR_BUFFER_BIT);

    glPolygonMode(GL_FRONT,GL_FILL);
    glPolygonMode(GL_BACK, GL_LINE);
 
    glColor3f (1.0, 0., 0.);
    glutWireSphere(1, 32, 32);
   
    glColor3f (1.0, 1.0, 1.0);
    glRotatef(45.0, 0.0, 1.0, 0.0);
    glutWireCube (50);

    //glTranslatef(0., 0., 10.);
    glutWireSphere(10, 32, 32);
               /* drawing Cube */
    //cube();
    //glutSwapBuffers(); //swap the buffers

    glFlush ();
}

void reshape (int w, int h)
{
    glViewport (0, 0, (GLsizei) w, (GLsizei) h);
    glMatrixMode (GL_MODELVIEW);
}

void keyboard (unsigned char key, int x, int y) {
    /*
    * Press ESC Key
    */
    if (key==27)
    {
    glutLeaveGameMode(); //set the resolution how it was
    exit(0); //quit the program
    }
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    //glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
    //glutInitDisplayMode  (GLUT_DOUBLE  | GLUT_DEPTH);
    /*
    * the settings for fullscreen mode
    */
    //glutGameModeString( "1024x768:32@75" );
    /*
    * set glut to fullscreen using the settings in the line above
    */
    //glutEnterGameMode();
    /*
    * Seting Screen Position
    */
    glutInitWindowPosition (0, 0);
    glutInitWindowSize (800, 600);
    glutCreateWindow (argv[0]);
    glutFullScreen();

    init ();

    glutDisplayFunc (display); //use the display function to draw everything
    /*
    * update any variables in display,
    * display can be changed to anyhing, as long as you move the
    * variables to be updated, in this case, angle++;
    * glutIdleFunc (display);
    */
    glutIdleFunc (display);
    glutReshapeFunc (reshape);
    glutKeyboardFunc (keyboard);
    glutMainLoop();

    return 0;
}

ติดตั้งอุปกรณ์การทดลองดังภาพ


ภาพที่ฉายลงบนวัตถุจริง ซึ่งมีการเหลี่อมเพียงเล็กน้อยเท่านั้น