2015年4月30日 星期四

02160136_陳威志 week10

第一堂

下載  OpenCV2.1
  • 到http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.1/

安裝  OpenCV2.1

開啟  Code Blocks


    • File - New - Project
    • 設定環境






    第二堂

    OpenGL設定










    程式碼
    #include <GL/glut.h>
    #include <opencv/highgui.h>

    float angle = 0;
    void display ()
    {
        glClear(GL_COLOR_BUFFER_BIT);
        glPushMatrix();
            glRotatef(angle, 0, 1, 0);
            glutSolidTeapot(0.3);
        glPopMatrix();
        glFlush();
        angle += 0.1;
    }

    int main(int argc, char* argv[])
    {
        IplImage * img = cvLoadImage("image.jpg");
        cvShowImage("02160136 2D", img);
        //cvWaitKey(0);

        glutInit(&argc, argv);
        glutCreateWindow("02160136 3D");

        glutDisplayFunc(display);
        glutIdleFunc(display);

        glutMainLoop();
    }



    貼圖設定 : 茶壺 , 地球



    程式碼

    #include <GL/glut.h> ///我們要使用 GLUT 3D 外掛
    #include <opencv/highgui.h> ///要使用 OpenCV的 高級High圖形介面GUI
    #include <opencv/cv.h> ///為了 cvCvtColor()而加上 cv.h
    float angle=0; ///為了自動轉的角度angle
    void display()
    {
        glEnable(GL_DEPTH_TEST); ///有深度(depth)測試的功能, 才會有正確的景深/前後關係
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ///清畫面
        glPushMatrix(); ///備份matrix
            glRotatef(angle, 0,1,0);  ///為了自動轉的角度angle
            glutSolidTeapot(0.3); ///茶壼
        glPopMatrix(); ///還原matrix
        glFlush(); ///把馬桶沖出去
        angle+=0.1;  ///為了自動轉的角度angle
    }
    void init()
    {   IplImage * img = cvLoadImage("image.jpg"); ///讀圖檔
        cvCvtColor(img, img, CV_BGR2RGB); /// ConVerT Color 把圖 BGR 變成 RGB
        glEnable(GL_TEXTURE_2D); ///開啟 2D貼圖功能
        GLuint id; /// unsigned int 整數, 要存你的貼圖ID
        glGenTextures(1, & id ); /// Generate 產生貼圖ID
        glBindTexture(GL_TEXTURE_2D, id); /// Bind 綁貼圖ID
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    ///參數設定 貼圖 S軸 如果超過了, 就REPEAT
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    ///參數設定 貼圖 T軸 如果超過了, 就REPEAT
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    ///參數設定 貼圖放大時 就用最近點 內插
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    ///參數設定 貼圖縮小時 就用最近點 內插
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
    }   /// 很長的一行, 把 image的圖, 全部設成貼圖的內容
    int main(int argc, char**argv) ///小心,要有 argc, argv哦
    {
        glutInit(&argc, argv); ///小心有個 & 哦
        glutCreateWindow("3D"); ///建個3D視窗

        glutDisplayFunc(display); ///畫圖函式
        glutIdleFunc(display); ///閒閒沒事幹, 就重畫

        init(); ///在 MainLoop前, 去做 initial 初始設定 (2D OpenCV, 3D OpenGL Texture)

        glutMainLoop(); ///主要迴圈卡住, 才不會突然程式就結束了
    }



    第三堂

    自轉地球

    #include <GL/glut.h> ///我們要使用 GLUT 3D 外掛
    #include <opencv/highgui.h> ///要使用 OpenCV的 高級High圖形介面GUI
    #include <opencv/cv.h> ///為了 cvCvtColor()而加上 cv.h
    float angle=0; ///為了自動轉的角度angle
    GLUquadric *quad;
    void display()
    {
        glEnable(GL_DEPTH_TEST); ///有深度(depth)測試的功能, 才會有正確的景深/前後關係
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); ///清畫面
        glPushMatrix(); ///備份matrix
            glRotatef(-90, 1,0,0);
            glRotatef(angle, 0,0,1);
            gluQuadricTexture(quad, 1);
            gluSphere(quad, 0.5, 30, 30);
        glPopMatrix(); ///還原matrix
        glFlush(); ///把馬桶沖出去
        angle+=0.1;  ///為了自動轉的角度angle
    }
    void myinit()
    {   quad = gluNewQuadric();
        IplImage * img = cvLoadImage("image.jpg"); ///讀圖檔
        cvCvtColor(img, img, CV_BGR2RGB); /// ConVerT Color 把圖 BGR 變成 RGB
        glEnable(GL_TEXTURE_2D); ///開啟 2D貼圖功能
        GLuint id; /// unsigned int 整數, 要存你的貼圖ID
        glGenTextures(1, & id ); /// Generate 產生貼圖ID
        glBindTexture(GL_TEXTURE_2D, id); /// Bind 綁貼圖ID
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    ///參數設定 貼圖 S軸 如果超過了, 就REPEAT
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    ///參數設定 貼圖 T軸 如果超過了, 就REPEAT
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    ///參數設定 貼圖放大時 就用最近點 內插
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    ///參數設定 貼圖縮小時 就用最近點 內插
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
    }   /// 很長的一行, 把 image的圖, 全部設成貼圖的內容
    int main(int argc, char**argv) ///小心,要有 argc, argv哦
    {
        glutInit(&argc, argv); ///小心有個 & 哦
        glutCreateWindow("02160136-3D"); ///建個3D視窗

        glutDisplayFunc(display); ///畫圖函式
        glutIdleFunc(display); ///閒閒沒事幹, 就重畫

        myinit(); ///在 MainLoop前, 去做 initial 初始設定 (2D OpenCV, 3D OpenGL Texture)

        glutMainLoop(); ///主要迴圈卡住, 才不會突然程式就結束了
    }


    沒有留言:

    張貼留言