2022年4月18日 星期一

TC*(˙Ⱉ˙ฅ)​的學習日誌-week09

主題:貼圖座標

範例網址:https://jsyeh.org/3dcg10/

下載windows.zip =>下載\windows\Texture.exe

下載date.zip =>下載\將data拉進windows\裡面有很多圖檔

點開Texture.exe


貼圖座標:glTexCoord2f(tx,ty,tz);


下載OpenCV 2.1.0 vs2008 版(相容性最廣、容量小)


注意在安裝到PATH的時候,要選擇第二個選項,Add OpenCV to the system PATH for all users
安裝路徑請使用預設


安裝完OpenCV之後要重開CodeBlocks
File-New-EmptyFile,檔名存成:week9_opencv.cpp

接下來要設定步驟
首先到工具列setting-compiler



1.打開setting-compiler後,在Search directories - compiler 要Add(新增) C:\OpenCV2.1\include


2.Search directories-linker要Add(新增) C:\OpenCV2.1\lib


3.setting - Compiler下面選Linker settings,要Add(新增) cv210、cxcore210、highgui210


範例程式碼:
#include <opencv/highgui.h>
int main()
{
    ///Ipl是Intel performance library的縮寫
    IplImage * img = cvLoadImage("檔名.png");///讀圖
    cvShowImage("week09",img);///秀圖
    cvWaitKey(0);///等任意鍵繼續

}

注意!!!程式碼圖片要存在同個地方,這樣子檔案才能夠執行
我的程式:
#include <opencv/highgui.h>
int main()
{
    ///Ipl是Intel performance library的縮寫
    IplImage * img = cvLoadImage("week09.jpg");///讀圖
    cvShowImage("week09",img);///秀圖
    cvWaitKey(0);///等任意鍵繼續

}

執行成果如下

接下來新增一個project,選擇GLUT命名為week09_texture
先去複製之前的十行茶壺程式
#include <GL/glut.h>
 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_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week09 texture");

    glutDisplayFunc(display);

    glutMainLoop();
    return 0;
}

接著去下載一個地球地圖的圖片,並且安裝在桌面上的freeglut-bin資料夾裡面



#include <GL/glut.h>
#include <opencv/highgui.h>
void myTexture()
{
    IplImage * img = cvLoadImage("earth.jpg");///去找地圖
    cvShowImage("img",img);///在img視窗放img的圖
    cvWaitKey(0);///等任意鍵繼續
}
 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_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week09 texture");

    glutDisplayFunc(display);
    myTexture();

    glutMainLoop();
    return 0;
}

注意喔,寫完之後會跳出三個視窗,分別是茶壺、地球地圖跟小黑視窗
但是茶壺的圖片並不會跑出來,會被地圖(img)卡住,所以要先關掉地圖才有辦法看到茶壺




將兩個圖片合成
#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 myTexture()
{
    IplImage * img = cvLoadImage("earth.jpg");///去找地圖
    cvShowImage("img",img);///在img視窗放img的圖
    cvWaitKey(0);///等任意鍵繼續
}
 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_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week09 texture");

    glutDisplayFunc(display);
    myTexture("earth.jpg");

    glutMainLoop();
    return 0;
}














沒有留言:

張貼留言