最終更新: mikk_ni3_92 2007年12月25日(火) 10:42:47履歴
現在地 >> メニュー >> サンプルコード::OpenGL >> GL+CV::テクスチャ
#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);
}
#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);
}