0

opencvとqtを使用してリアルタイムの顔検出プログラムを実装しようとしています。コードはmainwindow.hです。

 #include <QMainWindow>
 #include <opencv/cv.h>
 #include <opencv/highgui.h>
 #include <QLabel>

 namespace Ui {
 class MainWindow;
 }

 class MainWindow : public QMainWindow
  {
   Q_OBJECT
   public:
 explicit MainWindow(QWidget *parent = 0);
~MainWindow();
Ui::MainWindow* _ui;
CvCapture* _capture;
IplImage*       _img;
CvHaarClassifierCascade* _cascade;
CvMemStorage*   _storage;
QList<CvScalar>  _colors;
QPixmap*         _pixmap;
QTimer*          _timer;
QLabel* labelCapture;
private slots:
void on_actionCapture_triggered();
 };
//#endif // MAINWINDOW_H

main.cpp

  #include <QtGui/QApplication>
  #include "mainwindow.h"

   int main(int argc, char *argv[])
  {
   QApplication a(argc, argv);
   MainWindow w;
    w.show();

   return a.exec();
    }

mainwindow.cpp

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include "opencv/cv.h"
    #include "opencv/highgui.h"
    #include "opencv/cvaux.h"
    #include <QTimer>
    #include <QLabel>

    MainWindow::MainWindow(QWidget *parent) :
  QMainWindow(parent),
  _ui(new Ui::MainWindow)
  {
_ui->setupUi(this);
QLabel* labelCapture;
_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);
  labelCapture=new QLabel();
   }

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

   void MainWindow::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);
   }
   }

しかし、iamは次のエラーを受け取ります...関数on_action_capture_triggered()で、クラスui::mainWindowには'labelCapture'plshelpという名前のメンバーがありません...。

4

2 に答える 2

0

それはOpenCVの質問ではありません。あなたはQtの基本を誤解しています。

Qt Creatorを使用して新しいプロジェクトを作成してから、QtCreatorsデザイナーを使用してユーザーインターフェイスを作成することをお勧めします。したがって、これを行うと、プライベート を使用した見栄えの良いコードが得られます。Ui::MainWindow *ui次に、Qt Creatorsデザイナーを使用して、アクションを作成し、コーディングします。

幸運を!

于 2013-03-10T17:03:14.610 に答える
0

フォームにAQLABELがある場合は、名前を「labelCapture」に変更します。そうでない場合は、同じ名前でQLABELを作成するか、コードをqlabelの名前に変更できます。幸運を!

于 2015-11-25T13:32:23.780 に答える