現在地 >> メニュー >> サンプルコード::OpenGL >> GL+CV::テクスチャ

問題


OpenCVのウィンドウで絵を描いて、
それをOpenGL上のポリゴンにはりつけよ。

答え


#include <cstdio>
#include <iostream>

#include <GL/glut.h>
#include <cv.h>
#include <highgui.h>

using namespace std;


/* コールバック系 */
void display();
void reshape(int w, int h);
void timer(int value);

void cvMouseCb( int event, int x, int y, int flags ,void *param);

/* 各種関数系 */
void DRAW_SQU();



/* 外部変数 */
CvSize window={300,300};//ウィンドウサイズ
IplImage *imgA;


/*****[テクスチャ関連]*****/
GLuint texture[1];

/*****[画像読み込み準備]******************/
void LoadGLTextures()
{

cvCvtColor(imgA, imgA, CV_BGR2RGB);
cvFlip(imgA,NULL,0);

/******* テクスチャ作成 ****************/
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
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, 3, imgA->width,imgA->height, GL_RGB,GL_UNSIGNED_BYTE,imgA->imageData);

};


/************ OpenGL の初期設定 *************/
inline void GLUT_INIT()
{
glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(200,200);
}



inline void GLUT_CALL_FUNC()
{
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutTimerFunc(1,timer,0);
}


inline void MY_INIT()
{
glClearColor(1.0, 1.0, 1.0, 1.0);
}




/************ OpenCV関係 *****************/
void CV_SET_UP()
{
imgA = cvCreateImage(window,IPL_DEPTH_8U,3);
cvSet (imgA, CV_RGB(255,255,255), 0);

cvNamedWindow("OpenCV",CV_WINDOW_AUTOSIZE);
cvShowImage("OpenCV",imgA);
cvSetMouseCallback("OpenCV", cvMouseCb);
}




/************ main 関数 ********************/
int main(int argc, char ** argv)
{

glutInit(&argc,argv);
GLUT_INIT();

glutCreateWindow("OpenGL");
GLUT_CALL_FUNC();

MY_INIT();

CV_SET_UP(); //OpenCV関係

LoadGLTextures();

glutMainLoop();

return 0;
}


/********[ここから各種コールバック]****************************************/
void display()
{

glBindTexture(GL_TEXTURE_2D, texture[0]);
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);

glEnable(GL_DEPTH_TEST);


glPushMatrix();
glRotated((double)r, 0.0, 1.0, 0.0);
DRAW_SQU();

glPopMatrix();


glDisable(GL_DEPTH_TEST);

glutSwapBuffers();


r = r + 1;
if(r > 360)
{
r= 0;
}

}



void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1,1,-1,1,3,20);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}



void timer(int value)
{
glutPostRedisplay();
glutTimerFunc(1,timer,0); //タイマー関数
}

/******* [ここからOpenCVのコールバック] **********/
void cvMouseCb( int event, int x, int y, int flags ,void *param = NULL) // コールバック関数
{
static bool MOUSE_FLAG=false;

switch(event)
{

case CV_EVENT_LBUTTONDOWN:
MOUSE_FLAG = true;
break;

case CV_EVENT_LBUTTONUP:
MOUSE_FLAG=false;
cvFlip(imgA,NULL,0);
cvCvtColor(imgA, imgA, CV_BGR2RGB);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, imgA->width,imgA->height, GL_RGB,GL_UNSIGNED_BYTE,imgA->imageData);
cvFlip(imgA,NULL,0);
cvCvtColor(imgA, imgA, CV_RGB2BGR);
break;

}

if(event == CV_EVENT_MOUSEMOVE && MOUSE_FLAG == true)
{
cvRectangle(imgA,cvPoint(x,y),cvPoint(x+1,y+1),cvScalar(255,0,0));
cvShowImage("OpenCV",imgA);

}

}

/**********[ここから各種関数]***********************/

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);
}

メモ


マウスのボタンを離すと反映される。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます