0

我有一个带有许多按钮的窗口。每个触发一个子程序(使用 Opencv API 编写)。每个子程序在窗口上显示图像和内容。

问题是,当我关闭这些窗口(通过小红叉)时,所有按钮都变得无法点击。所以如果我想启动另一个程序,我将不得不退出主窗口并再次运行它。

换句话说,我希望能够运行所有的子程序,而不必每次都重新开始。

这是 GUI 的代码:

.cpp

#include "fenprincipale.h"
#include "ui_fenprincipale.h"
#include<highgui.h>
 #include<cv.h>
 #include <moyenetmedian.h>
#include<morpho.h>
#include<tracking.h>
#include<contour.h>
#include<QApplication>

FenPrincipale::FenPrincipale(QWidget *parent) :
QWidget(parent),
ui(new Ui::FenPrincipale)

{
ui->setupUi(this);
MoyenEtMedian *moyenEtMedian = new MoyenEtMedian;
morpho * mor = new morpho;
tracking * tra= new tracking;
contour * cont= new contour;

QObject::connect(ui->bMoyMed, SIGNAL( clicked() ), moyenEtMedian, SLOT( exec() ),    Qt::AutoConnection );
QObject::connect(ui->bMorph, SIGNAL( clicked() ), mor, SLOT( exec() ), Qt::AutoConnection );
QObject::connect(ui->bTrack, SIGNAL( clicked() ), tra, SLOT( exec() ), Qt::AutoConnection );
QObject::connect(ui->bCont, SIGNAL( clicked() ), cont, SLOT( exec() ), Qt::AutoConnection );

}



 FenPrincipale::~FenPrincipale()
{
 delete ui;
}

。H :

 #ifndef FENPRINCIPALE_H
  #define FENPRINCIPALE_H

    #include <QWidget>
    #include <QApplication>

    namespace Ui {
    class FenPrincipale;
     }

    class FenPrincipale : public QWidget
   {
     Q_OBJECT

  public:
     explicit FenPrincipale(QWidget *parent = 0);
      void switch_callback(int);
      void execMoyMed (void);


  ~FenPrincipale();

 private:
   Ui::FenPrincipale *ui;
   };

    #endif // FENPRINCIPALE_H

主要课程:

  #include <QCoreApplication>
  #include <QApplication>
  #include <QtGui>
   #include <QWidget>
   #include "fenprincipale.h"

    int main(int argc, char *argv[])
   {
        QApplication a(argc, argv);
        FenPrincipale fenetre;
        fenetre.show();
        return a.exec();

     }

“ moyenetmedian ”的插槽实现:

 void MoyenEtMedian::exec(void)
{
    const char* name = "Filtres";
    IplImage* img = cvLoadImage( "C:/Users/XELTINFO/ProjetVision/image.png" );
    IplImage* out = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 3 );
    cvNamedWindow( name, 1 );
    cvShowImage(name, out);

    // Create trackbar
    cvCreateTrackbar2( "Filtre", name, &g_switch_value, 1,  &MoyenEtMedian::switch_callback, this );

    while( 1 ) {
        switch( filterInt ){
            case 0:
                cvSmooth( img, out, CV_BLUR, 7, 7 );
                break;
            case 1:
                cvSmooth( img, out, CV_MEDIAN, 7, 7 );
                break;
                    }
        if(filterInt != lastfilterInt){
            cvShowImage(name, out);
            lastfilterInt = filterInt;
        }
        if( cvWaitKey( 15 ) == 27 )
            break;
    }

    cvReleaseImage( &img );
    cvReleaseImage( &out );
    cvDestroyWindow( name );

  }

类声明:

  #ifndef MOYENETMEDIAN_H
   #define MOYENETMEDIAN_H
   #include "ui_fenprincipale.h"
    #include<QObject>

     class MoyenEtMedian : public QObject
    {
   Q_OBJECT
public:
      MoyenEtMedian();
      static void switch_callback(int position, void*);

     public slots :
         void exec(void);

      };

   #endif // MOYENETMEDIAN_H

所有类的类声明和插槽实现都非常相似。如果这还不够,我会添加其余的。

4

2 回答 2

1

因此,当将 Qt 与 OpenCV 一起使用时,我会使用 Qt 的计时器而不是 while 循环来设置轮询。

这里有一个很好的使用 QTimers 与 OpenCV 对象交互的教程:

http://www.youtube.com/watch?v=0ONxIy8itRA

跳到 35 或 38 分钟,看看他是如何编写课程的。

基本上,您让 Qt 进行等待和计时,而不是使用带有等待调用的 while 循环进行计时。

如果可能,让 Qt 创建窗口,并将 OpenCV 窗口嵌套到 Qt 的窗口中,以便 Qt 可以管理窗口上的事件。

希望有帮助。

于 2012-12-14T20:19:03.443 回答
1

您正在阻止 exec() 插槽中的事件循环,因为它不会立即返回。相反,您应该继承 QWidget 并覆盖 keyPressEvent() 以从 Qt 的事件循环中获取键盘输入,而不是执行您当前拥有的忙循环。

于 2012-12-14T17:54:22.560 回答