【问题标题】:Face detection using opencv and qt使用opencv和qt进行人脸检测
【发布时间】:2015-11-25 21:32:23
【问题描述】:

我正在尝试使用opencv和qt实现一个实时人脸检测程序。代码是 主窗口.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();
    }

主窗口.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);
   }
   }

但是我收到以下错误... 关于函数 on_action_capture_triggered() 类 ui::mainWindow 没有名为“labelCapture”的成员 请帮忙....

【问题讨论】:

  • 你的命名空间是 Ui 而不是 ui。区分大小写
  • 然后错误成为令牌之前的预期主要表达式 -> 我也在 MainWindow 上声明了 _ui

标签: c++ qt opencv


【解决方案1】:

这不是 OpenCV 问题。您误解了 Qt 的基础知识。

我建议您使用 Qt Creator 创建新项目,然后使用 Qt Creators 设计器创建您的用户界面。因此,如果您这样做了,您将获得带有 private Ui::MainWindow *ui 的简洁代码,然后使用 Qt Creators 设计器创建您的操作并对其进行编码。

祝你好运!

【讨论】:

    【解决方案2】:

    如果您的表单上有 A QLABEL,则将其重命名为“labelCapture”,如果没有,则必须创建一个具有相同名称的表单,或者您可以将代码更改为 qlabel 的名称。 祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-28
      • 1970-01-01
      • 2013-03-23
      • 2017-10-02
      • 2013-10-28
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      相关资源
      最近更新 更多