diff --git a/CMakeLists.txt b/CMakeLists.txt index 9adbe74d91..4b687d8f04 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -507,7 +507,7 @@ endif() ############################### QT ################################ set(WITH_QT OFF CACHE BOOL "Build with QT Backend support") -set(WITH_QT_OPENGL ON CACHE BOOL "Add OpenGL extension to QT") +set(WITH_QT_OPENGL OFF CACHE BOOL "Add OpenGL extension to QT") set(HAVE_QT 0) set(HAVE_QT_OPENGL 0) @@ -519,6 +519,7 @@ if (WITH_QT) find_package (OpenGL QUIET) if (QT_QTOPENGL_FOUND AND OPENGL_FOUND) set(HAVE_QT_OPENGL 1) + add_definitions(-DHAVE_QT_OPENGL) endif() endif() endif() diff --git a/modules/highgui/include/opencv2/highgui/highgui_c.h b/modules/highgui/include/opencv2/highgui/highgui_c.h index 4f6dac9988..28afd89c8a 100644 --- a/modules/highgui/include/opencv2/highgui/highgui_c.h +++ b/modules/highgui/include/opencv2/highgui/highgui_c.h @@ -87,7 +87,7 @@ CVAPI(void) cvDisplayOverlay(const char* name, const char* text, int delayms); CVAPI(void) cvDisplayStatusBar(const char* name, const char* text, int delayms); typedef void (CV_CDECL *CvOpenGLCallback)(void* userdata); -CVAPI(void) cvCreateOpenGLCallback( const char* window_name, CvOpenGLCallback callbackOpenGL, void* userdata CV_DEFAULT(NULL)); +CVAPI(void) cvCreateOpenGLCallback( const char* window_name, CvOpenGLCallback callbackOpenGL, void* userdata CV_DEFAULT(NULL), double angle CV_DEFAULT(-1), double zmin CV_DEFAULT(-1), double zmax CV_DEFAULT(-1)); CVAPI(void) cvSaveWindowParameters(const char* name); CVAPI(void) cvLoadWindowParameters(const char* name); diff --git a/modules/highgui/src/window_QT.cpp b/modules/highgui/src/window_QT.cpp index fbe2e08cfe..29419a8b05 100755 --- a/modules/highgui/src/window_QT.cpp +++ b/modules/highgui/src/window_QT.cpp @@ -274,6 +274,7 @@ CV_IMPL int cvWaitKey( int arg ) } } guiMainThread._bTimeOut = false; + } return result; @@ -393,8 +394,8 @@ int icvInitSystem() wasInitialized = 1; qDebug()<<"init done"; -#if defined(OPENCV_GL)//OK tested ! - qDebug()<<"opengl support available"; +#if defined(HAVE_QT_OPENGL)//OK tested ! + qDebug()<<"opengl support available"; #endif } @@ -533,14 +534,17 @@ CV_IMPL int cvCreateButton(const char* button_name,CvButtonCallback on_change, v return 1;//dummy value } -CV_IMPL void cvCreateOpenGLCallback( const char* window_name, CvOpenGLCallback callbackOpenGL, void* userdata) +CV_IMPL void cvCreateOpenGLCallback( const char* window_name, CvOpenGLCallback callbackOpenGL, void* userdata, double angle, double zmin, double zmax) { QMetaObject::invokeMethod(&guiMainThread, "setOpenGLCallback", Qt::AutoConnection, Q_ARG(QString, QString(window_name)), Q_ARG(void*, (void*)callbackOpenGL), - Q_ARG(void*, userdata) + Q_ARG(void*, userdata), + Q_ARG(double, angle), + Q_ARG(double, zmin), + Q_ARG(double, zmax) ); } @@ -843,12 +847,12 @@ void GuiReceiver::destroyAllWindow() } -void GuiReceiver::setOpenGLCallback(QString window_name, void* callbackOpenGL, void* userdata) +void GuiReceiver::setOpenGLCallback(QString window_name, void* callbackOpenGL, void* userdata, double angle, double zmin, double zmax) { QPointer w = icvFindWindowByName( window_name.toLatin1().data() ); if (w && callbackOpenGL) - w->setOpenGLCallback((CvOpenGLCallback) callbackOpenGL, userdata); + w->setOpenGLCallback((CvOpenGLCallback) callbackOpenGL, userdata,angle,zmin,zmax); } void GuiReceiver::moveWindow(QString name, int x, int y) @@ -1251,7 +1255,7 @@ CvWindow::CvWindow(QString arg, int arg2) //2: my view int mode_display = CV_MODE_NORMAL; -#if defined(OPENCV_GL) +#if defined(HAVE_QT_OPENGL) mode_display = CV_MODE_OPENGL; #endif createView(mode_display); @@ -1507,9 +1511,9 @@ void CvWindow::createView(int mode) myview->setAlignment(Qt::AlignHCenter); } -void CvWindow::setOpenGLCallback(CvOpenGLCallback func,void* userdata) +void CvWindow::setOpenGLCallback(CvOpenGLCallback func,void* userdata, double angle, double zmin, double zmax) { - myview->setOpenGLCallback(func,userdata); + myview->setOpenGLCallback(func,userdata, angle, zmin, zmax ); } ViewPort* CvWindow::getView() @@ -1714,11 +1718,14 @@ ViewPort::ViewPort(CvWindow* arg, int arg2, int arg3) on_openGL_draw3D = NULL; -#if defined(OPENCV_GL) +#if defined(HAVE_QT_OPENGL) if ( mode_display == CV_MODE_OPENGL) { //QGLWidget* wGL = new QGLWidget(QGLFormat(QGL::SampleBuffers)); setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers))); + angle = DEFAULT_ANGLE; + zmin = DEFAULT_ZMIN; + zmax = DEFAULT_ZMAX; initGL(); } #endif @@ -1770,6 +1777,13 @@ void ViewPort::saveView() { QString extension = fileName.right(3); +#if defined(HAVE_QT_OPENGL) + image2Draw_qt_resized = ((QGLWidget*)viewport())->grabFrameBuffer(); +#else + QPainter saveimage(&image2Draw_qt_resized); + this->render(&saveimage); +#endif + // Save it.. if (QString::compare(extension, "png", Qt::CaseInsensitive) == 0) { @@ -1912,10 +1926,28 @@ void ViewPort::setMouseCallBack(CvMouseCallback m, void* param) on_mouse_param = param; } -void ViewPort::setOpenGLCallback(CvOpenGLCallback func,void* userdata) +void ViewPort::setOpenGLCallback(CvOpenGLCallback func,void* userdata, double angle_arg, double zmin_arg, double zmax_arg) { on_openGL_draw3D = func; on_openGL_param = userdata; + + if (angle_arg > 0) + angle = angle_arg; + else + angle = DEFAULT_ANGLE; + + + if (zmin_arg >= 0) + zmin = zmin_arg; + else + zmin = DEFAULT_ZMIN; + + + if (zmax_arg > 0) + zmax = zmax_arg; + else + zmax = DEFAULT_ZMAX; + } void ViewPort::controlImagePosition() @@ -2181,57 +2213,45 @@ void ViewPort::resizeEvent ( QResizeEvent *event) void ViewPort::paintEvent(QPaintEvent* event) { - //first paint on a file (to be able to save it if needed) - // --------- START PAINTING FILE -------------- // - QPainter myPainter(&image2Draw_qt_resized); - myPainter.setWorldTransform(param_matrixWorld); - draw2D(&myPainter); + QPainter myPainter(viewport()); + myPainter.setWorldTransform(param_matrixWorld); -#if defined(OPENCV_GL) - if ( mode_display == CV_MODE_OPENGL && on_openGL_draw3D) - { - //myPainter.beginNativePainting(); + draw2D(&myPainter); +#if defined(HAVE_QT_OPENGL) + if ( mode_display == CV_MODE_OPENGL && on_openGL_draw3D) + { + myPainter.save(); // Needed when using the GL1 engine + myPainter.beginNativePainting(); // Needed when using the GL2 engine + setGL(width(),height()); on_openGL_draw3D(on_openGL_param); - //draw3D(); unsetGL(); - - //myPainter.endNativePainting(); - } + + myPainter.endNativePainting(); // Needed when using the GL2 engine + myPainter.restore(); // Needed when using the GL1 engine + } #endif - //Now disable matrixWorld for overlay display - myPainter.setWorldMatrixEnabled (false ); + //Now disable matrixWorld for overlay display + //myPainter.setWorldMatrixEnabled (false ); - //in mode zoom/panning - if (param_matrixWorld.m11()>1) - { - if (param_matrixWorld.m11()>=threshold_zoom_img_region) - drawImgRegion(&myPainter); + //in mode zoom/panning + if (param_matrixWorld.m11()>1) + { + if (param_matrixWorld.m11()>=threshold_zoom_img_region) + drawImgRegion(&myPainter); - drawViewOverview(&myPainter); - } + drawViewOverview(&myPainter); + } - //for information overlay - if (drawInfo) - drawInstructions(&myPainter); - - // --------- END PAINTING FILE -------------- // - myPainter.end(); + //for information overlay + if (drawInfo) + drawInstructions(&myPainter); - //and now display the file - myPainter.begin(viewport()); - myPainter.drawImage(0, 0, image2Draw_qt_resized); - //end display - - //for statusbar - if (centralWidget->myStatusBar) - drawStatusBar(); - - QGraphicsView::paintEvent(event); + QGraphicsView::paintEvent(event); } void ViewPort::draw2D(QPainter *painter) @@ -2403,7 +2423,7 @@ void ViewPort::drawInstructions(QPainter *painter) -#if defined(OPENCV_GL)//all this section -> not tested +#if defined(HAVE_QT_OPENGL)//all this section -> not tested void ViewPort::initGL() { @@ -2435,7 +2455,7 @@ void ViewPort::setGL(int width, int height) glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); - icvgluPerspective(45, float(width) / float(height), 0.01, 1000); + icvgluPerspective(angle, float(width) / float(height), zmin, zmax); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); @@ -2447,38 +2467,6 @@ void ViewPort::unsetGL() glMatrixMode(GL_PROJECTION); glPopMatrix(); } - -void ViewPort::draw3D() -{ - //draw scene here - glLoadIdentity(); - - glTranslated(10.0, 10.0, -1.0); - // QVector3D p = convert(mouseCoordinate); - //glTranslated(p.x(),p.y(),p.z()); - - 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 } } - }; - - 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(); - } -} #endif #endif diff --git a/modules/highgui/src/window_QT.h b/modules/highgui/src/window_QT.h index 9f988ea4e7..6441421c4c 100644 --- a/modules/highgui/src/window_QT.h +++ b/modules/highgui/src/window_QT.h @@ -43,7 +43,7 @@ #include "precomp.hpp" -#if defined(OPENCV_GL) +#if defined(HAVE_QT_OPENGL)//OPENCV_GL) #include #include #endif @@ -96,6 +96,7 @@ enum { shortcut_zoom_normal = Qt::CTRL + Qt::Key_Z, shortcut_panning_down = Qt::CTRL + Qt::Key_Down }; + //end enum class CvWindow; @@ -133,7 +134,7 @@ public slots: void setRatioWindow(QString name, double arg2 ); void saveWindowParameters(QString name); void loadWindowParameters(QString name); - void setOpenGLCallback(QString window_name, void* callbackOpenGL, void* userdata); + void setOpenGLCallback(QString window_name, void* callbackOpenGL, void* userdata, double angle, double zmin, double zmax); void putText(void* arg1, QString text, QPoint org, void* font); void addButton(QString button_name, int button_type, int initial_button_state , void* on_change, void* userdata); @@ -267,7 +268,7 @@ public: void displayStatusBar(QString text, int delayms ); void readSettings(); void writeSettings(); - void setOpenGLCallback(CvOpenGLCallback arg1,void* userdata); + void setOpenGLCallback(CvOpenGLCallback arg1,void* userdata, double angle, double zmin, double zmax); void hideTools(); void showTools(); static CvButtonbar* createButtonbar(QString bar_name); @@ -326,6 +327,9 @@ static const int tableMouseButtons[][3]={ }; +static const double DEFAULT_ANGLE = 45.0; +static const double DEFAULT_ZMIN = 0.01; +static const double DEFAULT_ZMAX = 1000.0; class ViewPort : public QGraphicsView { Q_OBJECT @@ -335,7 +339,7 @@ public: void updateImage(void* arr); void startDisplayInfo(QString text, int delayms); void setMouseCallBack(CvMouseCallback m, void* param); - void setOpenGLCallback(CvOpenGLCallback func,void* userdata); + void setOpenGLCallback(CvOpenGLCallback func,void* userdata, double arg3, double arg4, double arg5); int getRatio(); void setRatio(int arg); @@ -407,8 +411,10 @@ private: void icvmouseHandler(QMouseEvent *event, type_mouse_event category, int &cv_event, int &flags); void icvmouseProcessing(QPointF pt, int cv_event, int flags); -#if defined(OPENCV_GL) - void draw3D(); +#if defined(HAVE_QT_OPENGL) + double angle; + double zmin; + double zmax; void unsetGL(); void initGL(); void setGL(int width, int height);