2021年4月7日 星期三

yun_電腦圖學筆記week07

 嗨

今天上課老師給我們看了一個程式,可以用各種不同的角度來看這張照片

接著老師教我們用codeblocks匯入圖片,所以我們安裝opencv並設定一些內容
點入compiler後會出現這個介面,設定Search directories裡面的compiler和linker
compiler->include
linker->lib



接著在linker settings裡面新增cv210、cxcore210、highgui210
glut外掛也安裝進來後,輸入程式碼就可以看到圖片了,我下載的圖片我命名為stitch

將opencv宣告進來
#include <opencv/highgui.h> int main(int argc,char**argv) { IplImage*img=cvLoadImage("stitch.jpg"); cvShowImage("stitch photo",img); cvWaitKey(0); }


接著我們把這張圖貼到茶壺上面去
將老師網頁上的程式碼偷過來
後面接著輸入以前學過的程式碼


#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可 #include <opencv/cv.h> #include <GL/glut.h> void init() { IplImage * img = cvLoadImage("stitch.jpg"); ///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); } ///最後一行最難/最重要, 所貼圖影像的資料都設定好 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("08160093"); glutDisplayFunc(display); init(); glutMainLoop(); }

這樣就完成了!!
接著我們讓圖片跟茶壺同時出現,將背景載入圖片
#include <opencv/highgui.h> ///使用 OpenCV 2.1 比較簡單, 只要用 High GUI 即可 #include <opencv/cv.h> #include <GL/glut.h> void init() { IplImage * img = cvLoadImage("stitch.jpg"); ///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); } ///最後一行最難/最重要, 所貼圖影像的資料都設定好 void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);///清空 glBegin(GL_POLYGON); glTexCoord2f(0,1);glVertex2f(-1,-1); glTexCoord2f(1,1);glVertex2f(+1,-1); glTexCoord2f(1,0);glVertex2f(+1,+1); glTexCoord2f(0,0);glVertex2f(-1,+1); glEnd(); glutSolidTeapot(0.3);///大身體 glutSwapBuffers(); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("08160093"); glutDisplayFunc(display); init(); glutMainLoop(); } 加入這一行段,就會變成這個樣子


1










沒有留言:

張貼留言

距地表面160 Week11

 #include "glm.h" GLMmodel* pmodel = NULL; void drawmodel(void) {     if (!pmodel) { pmodel = glmReadOBJ("data/porsche.obj...