2024年3月21日 星期四

電腦圖學Week05

week04

  1. opencv安裝

  2. 小心1:add opencv to .....path

  3. 小心2:要安裝在預設的目錄C:\OpenCV2.1

  4. 請安裝完後重開codeblocks
  5. 設定Settings-Compiler 要加入3個設定
  6. search 目錄 Compiler 的 include 目錄 加 C:\OpenCV2.1\include

  7. search 目錄 Linker 的 lib 目錄 加 C:\OpenCV2.1\lib 

  8. 加入 Linker 的 3個黨名 cv210 cxcore210 highgui210 

  9. 開一個新檔案打week05-1_opencv.cpp找一張圖改名image.jpg放c曹
    1. #include <opencv/highgui.h>
    2. int main()
    3. {
    4.     IplImage*img=cvLoadImage("c:/image.jpg");
    5.     cvShowImage("week05",img);
    6.     cvWaitKey(0);
    7. }
  10. 開一個新檔案打week05-2_opencv_webcam.cpp
  11. 開一個新檔案打week05-3_opencv_many_webcam.cpp
  12. https://jsyeh.org/3dcg10/點開下載window.zip和data,zip
    兩個解壓縮後把data資料夾放進window夾裡面
    打開Texture程式

  13. 解壓縮freeglut-MinGW-3.0.0-1.mp.zip打開freeglut再把lib裡的檔案複製一個變成libglut32.a
    再用glut創一個新檔案week05-4_opencv_cvLoadImage
    貼上11行程式
    在加3行opencv 的程式
    #include <GL/glut.h>
    #include <opencv/highgui.h>
    void display()
    {
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        glutSolidTeapot(0.3);
        glutSwapBuffers();
    }
    int main(int argc,char*argv[])
    {
        IplImage*img=cvLoadImage("c:/image.jpg");
        cvShowImage("opencv",img);
        glutInit(&argc,argv);
        glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
        glutCreateWindow("week05");
        glutDisplayFunc(display);
        glutMainLoop();
    }

  14. week05_opencv_opengl_myTexture
    glut專案week05_opencv_openg1_myTecture
    再貼上moodle老師有個github gidt 網址, 裡面有myTexture.cpp 18行
    後面10貼之前程式
    最後的glutMainLoop()之前,加入myTexture("")
    程式碼:
    #include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
    #include <opencv/cv.h>
    #include <GL/glut.h>
    int myTexture(char * filename)
    {
        IplImage * img = cvLoadImage(filename); ///OpenCV讀圖
        cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
        glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
        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); /// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖
        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);
        return id;
    }
    void display()
    {
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        glutSolidTeapot(0.3);
        glutSwapBuffers();
    }
    int main(int argc,char*argv[])
    {
        glutInit(&argc,argv);
        glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
        glutCreateWindow("week05");
        glutDisplayFunc(display);
        myTexture("c:/image.jpg");
        glutMainLoop();
    }

  15. week05_opencv_opengl_myTexture_glTexCoord2f
    貼上剛剛的程式碼week05_opencv_opengl_myTexture
    加入課本的4行程式
    cpp
    glTexCoord2f(0,0) ;glVertex2f(-1,-1);
    glTexCoord2f(0,1) ;glVertex2f(-1,+1);
    glTexCoord2f(1,1) ;glVertex2f(+1,+1);
    glTexCoord2f(1,0) ;glVertex2f(+1,-1);
    glEnd
    程式碼:
    #include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
    #include <opencv/cv.h>
    #include <GL/glut.h>
    int myTexture(char * filename)
    {
        IplImage * img = cvLoadImage(filename); ///OpenCV讀圖
        cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
        glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
        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); /// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖
        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);
        return id;
    }
    void display()
    {
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        glBegin(GL_POLYGON);
            glTexCoord2f(0,0) ;glVertex2f(-1,-1);
            glTexCoord2f(0,1) ;glVertex2f(-1,+1);
            glTexCoord2f(1,1) ;glVertex2f(+1,+1);
            glTexCoord2f(1,0) ;glVertex2f(+1,-1);
            glEnd();
        glutSolidTeapot(0.3);
        glutSwapBuffers();
    }
    int main(int argc,char*argv[])
    {
        glutInit(&argc,argv);
        glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
        glutCreateWindow("week05");
        glutDisplayFunc(display);
        myTexture("c:/image.jpg");
        glutMainLoop();
    }

  16. week05_rotating_earth
    找一張滿版地球圖取名叫earth.jpg
    把week05_opencv_opengl_myTexture的程式拿來用
    加上指標 GLUquadric * quad;
    程式碼:
    1. #include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可
    2. #include <opencv/cv.h>
    3. #include <GL/glut.h>
    4. GLUquadric * quad = NULL;
    5. int myTexture(char * filename)
    6. {
    7.     IplImage * img = cvLoadImage(filename); ///OpenCV讀圖
    8.     cvCvtColor(img,img, CV_BGR2RGB); ///OpenCV轉色彩 (需要cv.h)
    9.     glEnable(GL_TEXTURE_2D); ///1. 開啟貼圖功能
    10.     GLuint id; ///準備一個 unsigned int 整數, 叫 貼圖ID
    11.     glGenTextures(1, &id); /// 產生Generate 貼圖ID
    12.     glBindTexture(GL_TEXTURE_2D, id); ///綁定bind 貼圖ID
    13.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖T, 就重覆貼圖
    14.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); /// 貼圖參數, 超過包裝的範圖S, 就重覆貼圖
    15.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /// 貼圖參數, 放大時的內插, 用最近點
    16.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); /// 貼圖參數, 縮小時的內插, 用最近點
    17.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, img->imageData);
    18.     return id;
    19. }
    20. float angle=0;
    21. void display()
    22. {
    23.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    24.     glEnable(GL_DEPTH_TEST);
    25.     glPushMatrix();
    26.         glRotatef(90,1,0,0);
    27.         glRotatef(angle++,1,0,1);
    28.         gluSphere(quad,1,30,30);
    29.     glPopMatrix();
    30.     glutSwapBuffers();
    31. }
    32. int main(int argc,char*argv[])
    33. {
    34.     glutInit(&argc,argv);
    35.     glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    36.     glutCreateWindow("week05");
    37.     glutIdleFunc(display);
    38.     glutDisplayFunc(display);
    39.     myTexture("c:/earth.jpg");
    40.     quad=gluNewQuadric();
    41.     gluQuadricTexture(quad, 1);
    42.     glutMainLoop();
    43. }

沒有留言:

張貼留言