2024年3月18日 星期一

熱血學圖學round5

 ##openCV

1.安裝 OpenCV 2.1 (桌面)

2.記得安裝第三步驟,Add OpenCV to system PATH(勾第二個)

3.目錄不要改,要用預設的

4.檔案總管檢查 C:\ 多了 OpenCV2.1 目錄裡面有 include 有 lib 有 bin 三個好東西

5.關閉 CodeBlocks 再開,才會認識 OpenCV

接下來,要做CodeBlocks設定
1.Setting-Compiler,目錄compiler要加入include 目錄
2.Setting-Compiler,目錄linker要加入lib目錄

3.Setting-Compiler,linker setting要加入cv210 cxcore210 highgui210三個檔名


OpenCV的第一個程式!
檔名:week05-1_opencv.cpp

#include <opencv/highgui.h>
int main()
{///大寫 I 小寫 pl(Intel performance library)
    IplImage * img = cvLoadImage( "c:/luffy.jpg" ) ;
    ///在大寫的Image
    cvShowImage( "img" , img) ;
    cvWaitKey(0) ; ///等任意鍵在繼續
}

-----------------------------------------------------------------------------------------------------------------------------

從老師的網頁(https://jsyeh.org/3dcg10/)下載兩個檔案:1.data 2.win32先解壓縮win32的檔案 然後把data資料夾移到windows資料夾

打開 Transformation.exe

                                       👇





                      👇


                                      👇



                                     👇


` ` ` cpp
glBegin(...);
    glTexCoord2f ( tx, ty) ; glVertex2f ( x, y ) ;
    glTexCoord2f ( tx2, ty2 ) ; glVertex2f ( x2, y2 ) ;
    glTexCoord2f ( tx3, ty3 ) ; glVertex2f ( x3, y3 ) ;
    glTexCoord2f ( tx4, ty4 ) ; glVertex2f ( x4, y4 ) ; 
glEnd();
` ` `
    
-----------------------------------------------------------------------------------------------------------------------------
之前的十行再加上今天寫的三行
#include <GL/glut.h>
#include <opencv/highgui.h>
void display()
{
    glutSolidTeapot(0.3);
    glutSwapBuffers();
}
int main(int argc, char *argv[])
{
    IplImage * img = cvLoadImage("c:/luffy.jpg");
    ///在大寫的Image
    cvShowImage("img",img);
    ///cvWaitKey(0);///等任意鍵在繼續

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

    glutCreateWindow("week05-1 texture opencv");

    glutDisplayFunc(display);

    glutMainLoop();

}

-----------------------------------------------------------------------------------------------------------------------------
檔名:week05-2_texture_teapot_earth
複製老師18行的程式碼
#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 texture");

    glutDisplayFunc(display);
    myTexture("c:/earth.jpg");

    glutMainLoop();
}

-----------------------------------------------------------------------------------------------------------------------------
檔名:week05-3_texture_polygon
上一個程式再加上6行程式碼
#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 ( 1, 0 ) ; glVertex2f ( +1, -1 ) ;
        glTexCoord2f ( 1, 1 ) ; glVertex2f ( +1, +1 ) ;
        glTexCoord2f ( 0, 1 ) ; glVertex2f ( -1, +1 ) ;
    glEnd();
    glutSolidTeapot( 0.3 );
    glutSwapBuffers();
}
int main(int argc, char**argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week05 texture");

    glutDisplayFunc(display);
    myTexture("c:/earth.jpg");

    glutMainLoop();
}
----------------------------------------------------------------------------------------------------------
檔名:week05-4_texture_earth_rotate
會轉的地球!
#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;
}
float angle = 0;///要有旋轉角度
GLUquadric * quad = NULL;///用來畫地球quad二次曲面
void display()
{
    glEnable(GL_DEPTH_TEST);///開啟3D功能(深度測試)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///清背景
    glPushMatrix();
        glRotatef(90,1,0,0);///把他轉90度變是上下的軸
       glRotatef(angle++,0,0,1);///對著Z軸轉
       gluSphere(quad,1,30,30);///用二次曲面畫個圓球當地球
    glPopMatrix();
    glutSwapBuffers();
}
int main(int argc, char**argv)
{
    glutInit( &argc, argv );
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week05 texture");
    glutIdleFunc(display);
    glutDisplayFunc(display);
    quad=gluNewQuadric();///準備好quad二次曲面
    myTexture("c:/earth.jpg");
    gluQuadricTexture(quad,1);///準備好quad二次曲面的貼圖
    glutMainLoop();
}















































沒有留言:

張貼留言