最終更新: mikk_ni3_92 2008年12月09日(火) 15:57:06履歴
現在地 >> メニュー >> 基本編06 >> 基本編06::まとめコード3
#include <iostream> #include <string> #include <cv.h> #include <highgui.h> #include <GL/glut.h> //---------- 各種外部変数 ---------------// const int FileNum = 2; const std::string filename[FileNum] = {"file5.jpg","file6.jpg"}; //------------- プロトタイプ宣言 --------------------// void display(); void reshape(int w, int h); void timer(int value); void keyboard(unsigned char key, int x, int y); void DRAW_SQU(); //----- テクスチャID -----// GLuint texture[FileNum]; int ID = 0; //---------- 画像を読み込んでコンバート ----------------// bool LoadGLTextures() { IplImage *imgA[FileNum]; glGenTextures(2, &texture[0]); for (int loop = 0; loop < FileNum; ++loop) { imgA[loop] = cvLoadImage(filename[loop].c_str(),CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); if(imgA == NULL){ std::cerr <<filename[loop] << " : Can't Load Image\n"; return false; } cvFlip(imgA[loop]); //テクスチャ作成 glBindTexture(GL_TEXTURE_2D, texture[loop]); //バインド glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); //フィルタ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); gluBuild2DMipmaps(GL_TEXTURE_2D, 3, imgA[loop]->width,imgA[loop]->height, GL_BGR,GL_UNSIGNED_BYTE,imgA[loop]->imageData); cvReleaseImage( &imgA[loop] ); } return true; }; //-------------OpenGLの初期設定------------------// void GLUT_INIT() { glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(640,480); glutCreateWindow("Textures with OpenCV"); } void GLUT_CALL_FUNC() { glutDisplayFunc(display); glutReshapeFunc(reshape); glutTimerFunc(0,timer,17); glutKeyboardFunc(keyboard); } void MY_INIT() { glClearColor(1.0, 1.0, 1.0, 1.0); if( LoadGLTextures() == false){ //テクスチャの読み込みと作成 std::cerr << "Can't Load Image\n"; exit(0); } glEnable(GL_DEPTH_TEST); } //----------- メイン関数 ---------------// int main(int argc, char **argv) { glutInit(&argc,argv); GLUT_INIT(); GLUT_CALL_FUNC(); MY_INIT(); glutMainLoop(); return 0; } //----------- ここから各種コールバック ------------------// void display() { static int r = 0; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glPushMatrix(); glRotatef(static_cast<float>(r), 0.0, 1.0, 0.0); glBindTexture(GL_TEXTURE_2D, texture[ID]); DRAW_SQU(); glPopMatrix(); glutSwapBuffers(); if(++r > 360){ r= 0; } } void reshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); } void timer(int value) { glutPostRedisplay(); glutTimerFunc(value,timer,17); //タイマー関数 } void keyboard(unsigned char key, int x, int y) { switch (key) { case 'd': ID = ++ID % 2; break; } } //----------- ここから各種関数 -----------// void DRAW_SQU() { glEnable(GL_TEXTURE_2D); glBegin(GL_QUADS); glTexCoord2d(0.0, 1.0); glVertex2d(-1,1); glTexCoord2d(0.0, 0.0); glVertex2d(-1,-1); glTexCoord2d(1.0, 0.0); glVertex2d(1,-1); glTexCoord2d(1.0, 1.0); glVertex2d(1,1); glEnd(); glDisable(GL_TEXTURE_2D); }