forked from HRLTY/DenseFace3D
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathOGL_OCV_common.cpp
More file actions
133 lines (103 loc) · 3.21 KB
/
OGL_OCV_common.cpp
File metadata and controls
133 lines (103 loc) · 3.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
* OGL_OCV_common.cpp
* Common interop between OpenCV and OpenGL
*
* Created by Roy Shilkrot on 11/21/11.
* Copyright 2011 MIT. All rights reserved.
*
*/
#include "OGL_OCV_common.h"
void drawOpenCVImageInGL(const OpenCVGLTexture& tex) {
glDisable(GL_LIGHTING);
glDisable(GL_BLEND);
// IMPORTANT MODE!!!!!!!!
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
int vPort[4]; glGetIntegerv(GL_VIEWPORT, vPort);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tex.tex_id);
glPushMatrix();
glColor3ub(255, 255, 255);
glScaled(vPort[3], vPort[3], 1);
double aw2h = tex.aspect_w2h, ithr = tex.thr, itwr = tex.twr;
double n[3] = {0,0,-1};
GLint face_ori; glGetIntegerv(GL_FRONT_FACE, &face_ori);
glFrontFace(GL_CW); //we're gonna draw clockwise
glBegin(GL_QUADS);
glTexCoord2d(0, 0);
glNormal3dv(n);
glVertex2d(0, 0);
glTexCoord2d(0, ithr);
glNormal3dv(n);
glVertex2d(0, 1);
glTexCoord2d(itwr, ithr);
glNormal3dv(n);
glVertex2d(aw2h, 1);
glTexCoord2d(itwr, 0);
glNormal3dv(n);
glVertex2d(aw2h, 0);
glEnd();
glPopMatrix();
glFrontFace(face_ori); //restore front face orientation
glDisable(GL_TEXTURE_2D);
glEnable(GL_LIGHTING);
glEnable(GL_BLEND);
}
void glEnable2D()
{
int vPort[4];
glGetIntegerv(GL_VIEWPORT, vPort);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0, vPort[2], 0, vPort[3], -1, 4);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glTranslated(0.375, 0.375, 0);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); // clear the screen
glDisable(GL_DEPTH_TEST);
}
void glDisable2D()
{
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glEnable(GL_DEPTH_TEST);
}
#if defined(WIN32)
#define log2(x) log10((double)(x))/log10(2.0)
#endif
void copyImgToTex(const Mat& _tex_img, GLuint* texID, double* _twr, double* _thr) {
Mat tex_img = _tex_img;
flip(_tex_img,tex_img,0);
Mat tex_pow2(pow(2.0,ceil(log2(tex_img.rows))),pow(2.0,ceil(log2(tex_img.cols))),CV_8UC3);
//std::cout << tex_pow2.rows <<"x"<<tex_pow2.cols<<std::endl;
Mat region = tex_pow2(Rect(0,0,tex_img.cols,tex_img.rows));
if (tex_img.type() == region.type()) {
tex_img.copyTo(region);
} else if (tex_img.type() == CV_8UC1) {
cvtColor(tex_img, region, CV_GRAY2BGR);
} else {
tex_img.convertTo(region, CV_8UC3, 255.0);
}
if (_twr != 0 && _thr != 0) {
*_twr = (double)tex_img.cols/(double)tex_pow2.cols;
*_thr = (double)tex_img.rows/(double)tex_pow2.rows;
}
glBindTexture( GL_TEXTURE_2D, *texID );
glTexImage2D(GL_TEXTURE_2D, 0, 3, tex_pow2.cols, tex_pow2.rows, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, tex_pow2.data);
}
OpenCVGLTexture MakeOpenCVGLTexture(const Mat& _tex_img) {
OpenCVGLTexture _ocvgl;
glGenTextures( 1, &_ocvgl.tex_id );
glBindTexture( GL_TEXTURE_2D, _ocvgl.tex_id );
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
if (!_tex_img.empty()) { //image may be dummy, just to generate pointer to texture object in GL
copyImgToTex(_tex_img,&_ocvgl.tex_id,&_ocvgl.twr,&_ocvgl.thr);
_ocvgl.aspect_w2h = (double)_tex_img.cols/(double)_tex_img.rows;
}
return _ocvgl;
}