「OpenCVで読み込んだ画像をOpenGLで出力-CPP」の編集履歴(バックアップ)一覧はこちら
「OpenCVで読み込んだ画像をOpenGLで出力-CPP」(2009/09/24 (木) 23:37:22) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
*&this_page()
|&tags()|解説|最終更新日 &date()|&link_pdf(text=PDFで表示)|[[ダウンロード>http://www20.atwiki.jp/yosilove?cmd=upload&act=open&pageid=17&file=CVGL_sample.zip]]|
OpenCVで読み込んだ画像(IPL Image)はBGRなので、RGBに変換してOpenGLのウィンドウに出力する。
#contents
*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
*実行結果
#image(17-result.png,title=実行結果)
*テスト環境
|MacOSX 10.5.8|
|OpenCV 0,23|
|OpenGL|
|GLUT|
*Tanks
[[OpenCV@Chihara-Lab. : 高度なGUI>http://chihara.naist.jp/opencv/?%B9%E2%C5%D9%A4%CAGUI]]
上記のサンプルコードはこの方の作成したものを微修正したものです。
修正内容は「入力画像をカラーにした」「GLUI部分の削除」です。
----
*&this_page()
|&tags()|解説|最終更新日 &date()|&link_pdf(text=PDFで表示)|[[ダウンロード>http://www20.atwiki.jp/yosilove?cmd=upload&act=open&pageid=17&file=CVGL_sample.zip]]|View &counter(total)|
OpenCVで読み込んだ画像(IPL Image)はBGRなので、RGBに変換してOpenGLのウィンドウに出力する。
#contents
*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
*実行結果
#image(17-result.png,title=実行結果)
*テスト環境
|MacOSX 10.5.8|
|OpenCV 0,23|
|OpenGL|
|GLUT|
*Tanks
[[OpenCV@Chihara-Lab. : 高度なGUI>http://chihara.naist.jp/opencv/?%B9%E2%C5%D9%A4%CAGUI]]
上記のサンプルコードはこの方の作成したものを微修正したものです。
修正内容は「入力画像をカラーにした」「GLUI部分の削除」です。
----
表示オプション
横に並べて表示:
変化行の前後のみ表示: