stMind

You'll never blog alone

OpenCVで画像を読み込んでOpenGLで描画する

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は理解しなければいけないことが多いな...