OpenGLで画像上に3Dモデルを重畳したくて、久しぶりにOpenGLを触った。
OpenGLでは画像読み込みのAPIがない?ため、別のライブラリが必要になるみたい。そこで使い慣れたOpenCVを使って、画像を読み込んでGLで表示させてみた。
OpenCVのimreadを使うと、カラー画像であれば3chの2次元配列(cv::Mat、こちらを参照)で得られるので、これをOpenGLに渡してやれば良さそう。
注意するのは、OpenGLでは画素はRGBを想定していることと、原点は左下になっていること。(なのでflipとcvtColorをしてやる)
あとはOpenGLの作法に則って初期化と射影変換、ビューポート変換を実行すると画像が表示された。
#include <opencv/cv.h> #include <opencv/highgui.h> #include <glut.h> static void display(void) { cv::Mat img = cv::imread("test.jpg"); cv::flip(img, img, 0); cv::cvtColor(img, img, CV_BGR2RGB); glClear(GL_COLOR_BUFFER_BIT); glDrawPixels(img.cols, img.rows, GL_RGB, GL_UNSIGNED_BYTE, img.data); glFlush(); } static void keyboard(unsigned char key, int x, int y) { switch(key) { case 'q': case 'Q': case '\033': exit(1); default: break; } } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutInitWindowSize(640, 640); glutCreateWindow("TEST"); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, 640, 640, 0.0); glViewport(0, 0, 640, 640); glutDisplayFunc(display); glutKeyboardFunc(keyboard); glutMainLoop(); return 0; }
ちなみに、Mac OSX 10.9 + Xcode5.1でのコンパイルは以下。
$ clang++ -I/usr/local/include -I/opt/X11/include/GL -lopencv_core -lopencv_highgui -lopencv_imgproc -framework GLUT -framework OpenGL openglcv.cpp
それにしても、OpenGLは理解しなければいけないことが多いな...