1 | initial version |
Do not call imshow if you use your own draw callback:
void on_opengl(void* userdata);
int main(void)
{
VideoCapture webcam(CV_CAP_ANY);
namedWindow("window", CV_WINDOW_OPENGL);
Mat frame;
ogl::Texture2D tex;
setOpenGlDrawCallback("window", on_opengl, &tex);
while(waitKey(30) < 0)
{
webcam >> frame;
tex.copyFrom(frame);
updateWindow("window");
}
setOpenGlDrawCallback("window", 0, 0);
destroyAllWindows();
return 0;
}
void on_opengl(void* userdata)
{
ogl::Texture2D* pTex = static_cast<ogl::Texture2D*>(userdata);
if (pTex->empty())
return;
glLoadIdentity();
glTranslated(0.0, 0.0, 1.0);
glRotatef( 55, 1, 0, 0 );
glRotatef( 45, 0, 1, 0 );
glRotatef( 0, 0, 0, 1 );
static const int coords[6][4][3] = {
{ { +1, -1, -1 }, { -1, -1, -1 }, { -1, +1, -1 }, { +1, +1, -1 } },
{ { +1, +1, -1 }, { -1, +1, -1 }, { -1, +1, +1 }, { +1, +1, +1 } },
{ { +1, -1, +1 }, { +1, -1, -1 }, { +1, +1, -1 }, { +1, +1, +1 } },
{ { -1, -1, -1 }, { -1, -1, +1 }, { -1, +1, +1 }, { -1, +1, -1 } },
{ { +1, -1, +1 }, { -1, -1, +1 }, { -1, -1, -1 }, { +1, -1, -1 } },
{ { -1, -1, +1 }, { +1, -1, +1 }, { +1, +1, +1 }, { -1, +1, +1 } }
};
glEnable(GL_TEXTURE_2D);
pTex->bind();
for (int i = 0; i < 6; ++i) {
glColor3ub( i*20, 100+i*10, i*42 );
glBegin(GL_QUADS);
for (int j = 0; j < 4; ++j) {
glVertex3d(0.2*coords[i][j][0], 0.2 * coords[i][j][1], 0.2*coords[i][j][2]);
}
glEnd();
}
}