OpenCVのウィンドウ上にOpenGLで連番画像を動画として再生するサンプルコード. GLUTよりもはるかに簡単なことに気づく.
OpenCV3.1.0でWITH_OPENGLを有効にしてCMAKEしたものを使用. OpenGLはc:\Program Files (x86)\Windows Kits\8.1\Include\um\gl\GL.hを直接includeしてもエラーだらけになったので https://www.opengl.org/resources/libraries/glut/のglut.hをincludeした.
サンプルコード:
https://github.com/r168xr169/PlayImageSequenceOnCvOgl
#include <opencv2/opencv.hpp> #include <opencv2/core/opengl.hpp> #include <GL/glut.h> #include "cvlibs.h" void on_opengl(void* userdata); using namespace cv; int main(void) { VideoCapture video("./jpg/img%03d.jpg"); int w = video.get(CV_CAP_PROP_FRAME_WIDTH); int h = video.get(CV_CAP_PROP_FRAME_HEIGHT); int n = video.get(CV_CAP_PROP_FRAME_COUNT); namedWindow("window", CV_WINDOW_OPENGL); resizeWindow("window", w, h); Mat frame; ogl::Texture2D tex; setOpenGlDrawCallback("window", on_opengl, &tex); glEnable(GL_TEXTURE_2D); for(int i =0; i<n && waitKey(30); i++) { video >> frame; tex.copyFrom(frame); updateWindow("window"); } return 0; } void on_opengl(void* userdata) { ogl::Texture2D* pTex = static_cast<ogl::Texture2D*>(userdata); if (pTex->empty()) return; pTex->bind(); glLoadIdentity(); double x = +1.0; double y = -1.0; glColor3d(1.0, 1.0, 1.0); glBegin(GL_QUADS); glTexCoord2d(0.0, 0.0); glVertex2d(-x, -y); glTexCoord2d(1.0, 0.0); glVertex2d(+x, -y); glTexCoord2d(1.0, 1.0); glVertex2d(+x, +y); glTexCoord2d(0.0, 1.0); glVertex2d(-x, +y); glEnd(); }