1#include <iostream>
2#include "cvconfig.h"
3
4#ifndef HAVE_OPENGL
5int main()
6{
7    std::cerr << "Library was built without OpenGL support" << std::endl;
8    return -1;
9}
10#else
11
12#ifdef WIN32
13    #define WIN32_LEAN_AND_MEAN 1
14    #define NOMINMAX 1
15    #include <windows.h>
16#endif
17#if defined(_WIN64)
18    #include <windows.h>
19#endif
20
21#if defined(__APPLE__)
22    #include <OpenGL/gl.h>
23    #include <OpenGL/glu.h>
24#else
25    #include <GL/gl.h>
26    #include <GL/glu.h>
27#endif
28
29#include "opencv2/core/core.hpp"
30#include "opencv2/core/opengl.hpp"
31#include "opencv2/core/cuda.hpp"
32#include "opencv2/highgui/highgui.hpp"
33
34using namespace std;
35using namespace cv;
36using namespace cv::cuda;
37
38const int win_width = 800;
39const int win_height = 640;
40
41struct DrawData
42{
43    ogl::Arrays arr;
44    ogl::Texture2D tex;
45    ogl::Buffer indices;
46};
47
48void draw(void* userdata);
49
50void draw(void* userdata)
51{
52    DrawData* data = static_cast<DrawData*>(userdata);
53
54    glRotated(0.6, 0, 1, 0);
55
56    ogl::render(data->arr, data->indices, ogl::TRIANGLES);
57}
58
59int main(int argc, char* argv[])
60{
61    string filename;
62    if (argc < 2)
63    {
64        cout << "Usage: " << argv[0] << " image" << endl;
65        filename = "../data/lena.jpg";
66    }
67    else
68        filename = argv[1];
69
70    Mat img = imread(filename);
71    if (img.empty())
72    {
73        cerr << "Can't open image " << filename << endl;
74        return -1;
75    }
76
77    namedWindow("OpenGL", WINDOW_OPENGL);
78    resizeWindow("OpenGL", win_width, win_height);
79
80    Mat_<Vec2f> vertex(1, 4);
81    vertex << Vec2f(-1, 1), Vec2f(-1, -1), Vec2f(1, -1), Vec2f(1, 1);
82
83    Mat_<Vec2f> texCoords(1, 4);
84    texCoords << Vec2f(0, 0), Vec2f(0, 1), Vec2f(1, 1), Vec2f(1, 0);
85
86    Mat_<int> indices(1, 6);
87    indices << 0, 1, 2, 2, 3, 0;
88
89    DrawData data;
90
91    data.arr.setVertexArray(vertex);
92    data.arr.setTexCoordArray(texCoords);
93    data.indices.copyFrom(indices);
94    data.tex.copyFrom(img);
95
96    glMatrixMode(GL_PROJECTION);
97    glLoadIdentity();
98    gluPerspective(45.0, (double)win_width / win_height, 0.1, 100.0);
99
100    glMatrixMode(GL_MODELVIEW);
101    glLoadIdentity();
102    gluLookAt(0, 0, 3, 0, 0, 0, 0, 1, 0);
103
104    glEnable(GL_TEXTURE_2D);
105    data.tex.bind();
106
107    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
108    glTexEnvi(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_REPLACE);
109
110    glDisable(GL_CULL_FACE);
111
112    setOpenGlDrawCallback("OpenGL", draw, &data);
113
114    for (;;)
115    {
116        updateWindow("OpenGL");
117        int key = waitKey(40);
118        if ((key & 0xff) == 27)
119            break;
120    }
121
122    setOpenGlDrawCallback("OpenGL", 0, 0);
123    destroyAllWindows();
124
125    return 0;
126}
127
128#endif
129