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) [email protected] $(CXXFLAGS) $(LDFLAGS) $(FRAMEWOKS) -o $@ .c: $(CC) [email protected] $(CXXFLAGS) $(LDFLAGS) $(FRAMEWOKS) -o $@
実行方法
コンパイルする
make CVGL_samp
実行する
./CVGL_samp
実行結果

テスト環境
| MacOSX 10.5.8 |
| OpenCV 0,23 |
| OpenGL |
| GLUT |
Tanks
上記のサンプルコードはこの方の作成したものを微修正したものです。 修正内容は「入力画像をカラーにした」「GLUI部分の削除」です。