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