OpenCVで読み込んだ画像をOpenGLで出力-CPP
CPP GLUT Mac OpenCV OpenGL ソースコード | 解説 | 最終更新日 2009-09-24 | link_pdfプラグインはご利用いただけなくなりました。 |
ダウンロード | View - |
OpenCVで読み込んだ画像(IPL Image)はBGRなので、RGBに変換してOpenGLのウィンドウに出力する。
CVGL_samp.cpp
//[OpenCV@Chihara-Lab.] 高度なGUI //http://chihara.naist.jp/opencv/?%B9%E2%C5%D9%A4%CAGUI // //[2009/9/23] GLUI部分を削除/カラー画像の読み込み #include <iostream> #include <GLUT/glut.h> #include <cv.h> #include <highgui.h> IplImage *inputImage; /* 表示用 */ IplImage *image; IplImage *rgbImage; void initializeImageProcessing() { /* ここにプログラム起動時の行う画像処理を書く */ //inputImage = cvLoadImage("img/bmp/Mandrill.bmp", CV_LOAD_IMAGE_GRAYSCALE); // グレースケール inputImage = cvLoadImage("img/bmp/Mandrill.bmp", CV_LOAD_IMAGE_ANYCOLOR); /* ここまで */ } void imageProcessing() { /* ここに適当な画像処理を書く.imageに最終的な出力を行う. */ cvErode(inputImage, image, 0, erosions); // 例えば縮退処理を行なう /* ここまで */ } void display() { imageProcessing(); glClear(GL_COLOR_BUFFER_BIT); glPixelZoom(1, -1); glRasterPos2i(0 , 0); rgbImage = cvCloneImage(image); //IPL形式の画像(BGR)をOpenGL形式(RGB)に変換 if (image->nChannels >= 2) { // BGR(A) -> RGB(A) for (int i = 0; i < image->width * image->height * image->nChannels; i = i + image->nChannels) { rgbImage->imageData[i] = image->imageData[i + 2]; rgbImage->imageData[i + 2] = image->imageData[i]; } } //チャンネルに応じて書き込み方を変更 switch (image->nChannels) { case 1: glDrawPixels(image->width, image->height, GL_LUMINANCE, GL_UNSIGNED_BYTE, image->imageData); break; case 3: glDrawPixels(image->width, image->height, GL_RGB, GL_UNSIGNED_BYTE, rgbImage->imageData); break; case 4: glDrawPixels(image->width, image->height, GL_RGBA, GL_UNSIGNED_BYTE, rgbImage->imageData); break; default: break; } //出力 glFlush(); } void glInit() { glClearColor(0.0, 0.0, 1.0, 1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0, image->width - 1.0, image->height - 1.0, 0.0, -1.0, 1.0); } void cvInit() { initializeImageProcessing(); /* 表示する画像のサイズやチャネル数を設定する(とりあえずIPL_DPETH_8Uは固定)*/ image = cvCreateImage(cvSize(inputImage->width, inputImage->height), IPL_DEPTH_8U, 3); //image = cvCreateImage(cvSize(inputImage->width, inputImage->height), IPL_DEPTH_8U, 1);グレースケール } int main(int argc, char *argv[]) { //OpenCVの初期化 cvInit(); //OpenGLとGLUTの初期化 //(OpenCVみたいにまとめないのはargcとargvが必要だから?) glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutInitWindowSize(image->width, image->height); mainWindowID = glutCreateWindow("IplImage"); glutDisplayFunc(display); glInit(); //メインループ突入(displayを繰り返し実行) glutMainLoop(); return 0; }
Makefile
Mac
CXX = g++ -Wall -O2 CC = gcc -Wall -O2 CXXFLAGS = `pkg-config --cflags opencv` LDFLAGS = `pkg-config --libs opencv` FRAMEWOKS = -framework OpenGL -framework GLUT -framework Foundation .cpp: $(CXX) $@.cpp $(CXXFLAGS) $(LDFLAGS) $(FRAMEWOKS) -o $@ .c: $(CC) $@.c $(CXXFLAGS) $(LDFLAGS) $(FRAMEWOKS) -o $@
実行方法
コンパイルする
make CVGL_samp
実行する
./CVGL_samp
実行結果
テスト環境
MacOSX 10.5.8 |
OpenCV 0,23 |
OpenGL |
GLUT |
Tanks
上記のサンプルコードはこの方の作成したものを微修正したものです。 修正内容は「入力画像をカラーにした」「GLUI部分の削除」です。