2024年3月21日 星期四

week05電腦圖學


week05 week05_opencv.cpp
1. 安裝 open CV (桌面)
2. 注意更改:安裝第三步 ADD openCV to system PATH
3. 注意預設目錄不用改
4. 檔案總管檢查  OpenCV2.1 含有 include lib bin
5. 關閉 CodeBlocks  重開

CodeBlocks設定
(1)setting-Compiler  目錄compiler加入include 目錄
(2)setting-Complier 目錄linker加入lib 目錄
(3)setting-Complier 目錄linker setting 加入cv210 cxcore210  highgui210 目錄

寫 Open CV程式—CodeBlocks 新稱空白檔案 week05-1_opencv.cpp
找jpg圖片後把圖片放置 c:裡


程式碼: 
#include <opencv/highgui.h>
int main()
{
    IplImage*img=cvLoadImage("c:/image.jpg");
    cvShowImage("week05", img);
    cvWaitKey(0);
}

執行後結果(圖片):


課本範例-貼圖
1.開啟網址   https://jsyeh.org/3dcg10/
2.下載 windows data 檔案 解壓縮  
3.把data丟進windows裡
3.執行Texture.exe
4.改glTexCoord2f(tx, ty); 貼圖座標, glVertex3f(x, y, z); 頂點


week05_opencv_cvLoadImage
1.安裝 freeglut 桌面
2.新增glut專案
3.貼上 10行程式碼
4.加上3行程式碼

程式碼:
#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();
}

執行後結果:

week05_opencv_opengl_myTexture
1.新增專案
2.貼上18行程式碼https://gist.github.com/jsyeh/5ed01210559721ec71b659b3ffed2dd7
3.再貼上10行程式碼

程式碼:
#include <opencv/highgui.h> 
#include <opencv/cv.h>
#include <GL/glut.h>
int myTexture(char * filename)
{
    IplImage * img = cvLoadImage(filename); 
    cvCvtColor(img,img, CV_BGR2RGB);
    glEnable(GL_TEXTURE_2D);
    GLuint id;
    glGenTextures(1, &id); 
    glBindTexture(GL_TEXTURE_2D, id);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_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);
    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();
}

執行後結果:

week05_opencv_opengl_myTexture_glTexCoord2f
1.新增專案
2.貼上week05_opencv_opengl_myTexture程式
3.加上6行程式

加入的程式碼:    
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();


執行後結果(背景顛倒的茶壺):


week05_rotating_earth
1.google: earth map找滿版圖片,存放至c:/
2.新增專案
3.貼上week05_opencv_opengl_myTexture程式
4.加上一些程式

程式碼:
#include <opencv/highgui.h> 
#include <opencv/cv.h>
#include <GL/glut.h>
GLUquadric*quad=NULL;
int myTexture(char * filename){
    IplImage * img = cvLoadImage(filename); 
    cvCvtColor(img,img, CV_BGR2RGB); 
    glEnable(GL_TEXTURE_2D);
    GLuint id; 
    glGenTextures(1, &id);
    glBindTexture(GL_TEXTURE_2D, id); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_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);
    return id;
}
float angle=0;
void display(){
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    glPushMatrix();
        glRotatef(90, 1, 0, 0);
        glRotatef(angle++, 0, 0, 1);
        gluSphere(quad, 1, 30, 30);
    glPopMatrix();
    glutSwapBuffers();
}
int main(int argc, char *argv[]){
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("week05");
    glutIdleFunc(display);
    glutDisplayFunc(display);
    myTexture("c:/earth.jpg");
    quad=gluNewQuadric();
    gluQuadricTexture(quad,1);

    glutMainLoop();
}


執行後結果(會旋轉的地球):








沒有留言:

張貼留言