最終更新: mikk_ni3_92 2008年08月26日(火) 18:41:43履歴
現在地 >> メニュー >> サンプルコード::OpenGL >> α値とテクスチャの切り抜き
#include <iostream> #include <cv.h> #include <highgui.h> #include <GL/glut.h> //------------- プロトタイプ宣言 --------------------// IplImage *cvLoadImageBGRA(const char *filename,int iscolor = 1); IplImage *GetMaskFromBGR(IplImage *BGRImg); //マスク画像を取得 void display(); void reshape(int w, int h); void timer(int value); void DRAW_SQU(); //----- テクスチャID -----// GLuint texture[1]; //---------- 画像を読み込んでコンバート ----------------// bool LoadGLTextures() { IplImage *image1=cvLoadImageBGRA("fai.png",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); if(image1==NULL) { return false; } cvFlip(image1,NULL,0); /******* テクスチャ作成 ****************/ glGenTextures(1, &texture[0]); glBindTexture(GL_TEXTURE_2D, texture[0]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); gluBuild2DMipmaps(GL_TEXTURE_2D, 4, image1->width,image1->height, GL_BGRA,GL_UNSIGNED_BYTE,image1->imageData); cvReleaseImage( &image1 ); return true; }; //--------------- ここから各種関数 -----------------// IplImage *cvLoadImageBGRA(const char *filename,int iscolor) { //RGBの3色 IplImage *ImgBGR = cvLoadImage(filename,iscolor); if(ImgBGR == NULL) {return NULL;} //マスク画像作成 IplImage *Mask = GetMaskFromBGR(ImgBGR); if(Mask == NULL) { cvReleaseImage(&ImgBGR); return NULL; } IplImage *BGRA = cvCreateImage(cvGetSize(ImgBGR),IPL_DEPTH_8U,4); if(BGRA == NULL) { cvReleaseImage(&ImgBGR); cvReleaseImage(&Mask); return NULL; } const CvArr *InputPlane[2]={ImgBGR,Mask}; int from_to[] = { 0, 0, 1, 1, 2, 2, 3, 3 }; cvMixChannels(InputPlane,2,(CvArr**)&BGRA,1,from_to,4); cvReleaseImage(&Mask); cvReleaseImage(&ImgBGR); return BGRA; } //--------- マスク画像の作成 ----------------// IplImage *GetMaskFromBGR(IplImage *BGRImg) { //グレイスケール用 IplImage *gray = cvCreateImage(cvGetSize(BGRImg),IPL_DEPTH_8U,1); if(gray == NULL){return NULL;} //グレイスケール画像作成 cvCvtColor(BGRImg, gray, CV_BGR2GRAY); //マスク画像の作成 cvThreshold(gray,gray,254,255,CV_THRESH_BINARY); cvNot(gray,gray); return gray; } //-------------OpenGLの初期設定------------------// void GLUT_INIT() { glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("window name"); } void GLUT_CALL_FUNC() { glutDisplayFunc(display); glutReshapeFunc(reshape); glutTimerFunc(0,timer,17); } void MY_INIT() { glClearColor(1.0, 1.0, 1.0, 1.0); if( LoadGLTextures() == false) { std::cerr << "Can't Load Image\n"; } glEnable(GL_DEPTH_TEST); glAlphaFunc(GL_GREATER, 0); //0より大きい所が切り抜き } 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); //後ろに壁を描画 glColor3d(1,0,1); glPushMatrix(); glTranslated(0,0,-1); glRectd(-1,1,1,-1); glPopMatrix(); //透過処理付きのポリゴン glColor3d(1,1,1); glEnable(GL_ALPHA_TEST); glPushMatrix(); glRotated(static_cast<double>(r), 0.0, 1.0, 0.0); DRAW_SQU(); glPopMatrix(); glDisable(GL_ALPHA_TEST); 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); glLoadIdentity(); gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); } void timer(int value) { glutPostRedisplay(); glutTimerFunc(value,timer,17); //タイマー関数 } /**********[ここから各種関数]***********************/ 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); }