※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

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部分の削除」です。