2015-03-30 1 views
1

J'essaie d'afficher à l'écran le flux en direct à partir d'une caméra qui affichera les visages détectés. Cependant je continue à obtenir:Aucun signal correspondant pour On_actionCapture_triggered

QMetaObject::connectSlotsByName: No matching signal for On_actionCapture_triggered() 

J'ai codé cela sans utiliser l'interface graphique pour relier tous les emplacements ou les signaux. Je ne comprends pas où sont les problèmes.

Le programme s'exécute puis l'erreur s'affiche dans la zone de sortie Application.

Tout aperçu de l'endroit où le problème est serait apprécié.

Le fichier .h est

#ifndef DIALOG_H 
#define DIALOG_H 

#include <QDialog> 
#include <opencv/cv.h> 
#include <opencv/highgui.h> 


namespace Ui { 
class Dialog; 
} 

class Dialog : public QDialog 
{ 
    Q_OBJECT 

public: 
    explicit Dialog(QWidget *parent = 0); 
    ~Dialog(); 

private slots: 
    void on_actionCapture_triggered(); 

private: 
    Ui::Dialog* _ui; 
    CvCapture*  _capture; 
    IplImage*  _img; 
    CvHaarClassifierCascade* _cascade; 
    CvMemStorage* _storage; 
    QList<CvScalar> _colors; 
    QPixmap*   _pixmap; 
    QTimer*   _timer; 

}; 

Le fichier cpp est:

#endif // DIALOG_H 

#include "dialog.h" 
#include "ui_dialog.h" 
#include "opencv/cv.h" 
#include "opencv/highgui.h" 
#include "opencv/cvaux.h" 

#include <QTimer> 


Dialog::Dialog(QWidget *parent) : 
QDialog(parent), 
_ui(new Ui::Dialog) 
{ 
    _ui->setupUi(this); 
    _capture = cvCaptureFromCAM(0); 
    _cascade = (CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_alt2.xml"); 
    _storage = cvCreateMemStorage(0); 

    _colors << cvScalar(0.0,0.0,255.0) << cvScalar(0.0,128.0,255.0) 
      << cvScalar(0.0,255.0,255.0) << cvScalar(0.0,255.0,0.0) 
      << cvScalar(255.0,128.0,0.0) << cvScalar(255.0,255.0,0.0) 
      << cvScalar(255.0,0.0,0.0) << cvScalar(255.0,0.0,255.0); 

    _timer = new QTimer(this); 
    connect(_timer, SIGNAL(timeout()), this, SLOT(on_actionCapture_triggered())); 
    _timer->start(10); 
} 

Dialog::~Dialog() 
{ 
    cvReleaseImage(&_img); 
    cvReleaseCapture(&_capture); 
    delete _ui; 
} 

void Dialog::on_actionCapture_triggered() 
{ 
    // Query camera for next frame 
    _img = cvQueryFrame(_capture); 

    if (_img) 
    { 
     // Detect objects 
     cvClearMemStorage(_storage); 

     CvSeq* objects = cvHaarDetectObjects(_img, 
             _cascade, 
             _storage, 
             1.1, 
             3, 
             CV_HAAR_DO_CANNY_PRUNING, 
             cvSize(100, 100)); 

     int n = (objects ? objects->total : 0); 

     CvRect* r; 
     // Loop through objects and draw boxes 
     for(int i = 0; i < n; i++) 
     { 
      r = (CvRect*)cvGetSeqElem(objects, i); 
      cvRectangle(_img, 
         cvPoint(r->x, r->y), 
         cvPoint(r->x + r->width, r->y + r->height), 
         _colors[i%8] 
         ); 
     } 

     // Convert IplImage to QImage 
     QImage image = QImage((const uchar *)_img->imageData, 
           _img->width, 
           _img->height, 
           QImage::Format_RGB888).rgbSwapped(); 
     _pixmap = new QPixmap(QPixmap::fromImage(image)); 
     _ui->labelCapture->setPixmap(*_pixmap); 
    } 
} 

Répondre

0

Les Qt autoconnect mechanism essaie de se connecter des signaux à fentes d'objets avec la forme de:

void on_<object name>_<signal name>(<signal parameters>); 

Donc, ici, il essaie de trouver un objet avec le nom actionCapture qui a un signal avec le nom de o f triggered pour le connecter à votre emplacement. Mais il n'y a pas une telle chose et cela produit cet avertissement.

Vous devriez changer le nom de votre emplacement à un autre nom pour éviter cet avertissement.