QT new functions:

- cvCreateOpenGLCallback: draw 3D on top of the image
This commit is contained in:
Yannick Verdie 2010-07-23 15:22:04 +00:00
parent d352db7ec4
commit f2353b8523
4 changed files with 86 additions and 91 deletions

View File

@ -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()

View File

@ -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);

View File

@ -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<CvWindow> 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

View File

@ -43,7 +43,7 @@
#include "precomp.hpp"
#if defined(OPENCV_GL)
#if defined(HAVE_QT_OPENGL)//OPENCV_GL)
#include <QtOpenGL>
#include <QGLWidget>
#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);