項目pro文件:
#------------------------------------------------- # # Project created by QtCreator 2014-01-18T14:39:58 # #------------------------------------------------- QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = opencv_vedio TEMPLATE = app INCLUDEPATH +=D:\program\opencv\build\include\ INCLUDEPATH +D:\program\opencv\build\include\opencv\ INCLUDEPATH +=D:\program\opencv\build\include\opencv2\ CONFIG(debug,debug|release) { LIBS += -LD:\program\opencv\build\x86\vc10\lib \ -lopencv_core244d \ -lopencv_highgui244d \ -lopencv_imgproc244d \ -lopencv_features2d244d \ -lopencv_calib3d244d } else { LIBS += -LD:\program\opencv\build\x86\vc10\lib \ -lopencv_core244 \ -lopencv_highgui244 \ -lopencv_imgproc244 \ -lopencv_features2d244 \ -lopencv_calib3d244 } SOURCES += main.cpp\ dialog.cpp HEADERS += dialog.h FORMS += dialog.ui
dialog.h:
#ifndef DIALOG_H #define DIALOG_H #include <QDialog> #include <opencv/cv.h> #include <opencv/highgui.h> #include <QTimer> #include <QPixmap> namespace Ui { class Dialog; } class Dialog : public QDialog { Q_OBJECT public: explicit Dialog(QWidget *parent = 0); ~Dialog(); private: Ui::Dialog *ui; CvCapture *capture; //highgui 里提供的一個專門處理攝像頭圖像的結構體 IplImage *frame; //攝像頭每次抓取的圖像為一幀,使用該指針指向一幀圖像的內存空間 QTimer *timer; //定時器用於定時取幀,上面說的隔一段時間就去取就是用這個實現。 private slots: void getFrame(); //實現定時從攝像頭取圖並顯示在label上的功能。 }; #endif // DIALOG_H
dialog.cpp:
#include "dialog.h" #include "ui_dialog.h" #include <QDebug> Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); timer = new QTimer(this); capture = cvCaptureFromCAM(0); //cvCaptureFromCAM其實是一個宏,就是cvCreateCameraCapture的別名,0代表第一個攝像頭。-1代表默認攝像頭。 if(capture==NULL){ qDebug()<<"error!"; } timer->start(50); //1000為1秒,50毫秒去取一幀 connect(timer,SIGNAL(timeout()),this,SLOT(getFrame())); //超時就去取 } Dialog::~Dialog() { timer->stop(); //停止取幀 cvReleaseCapture(&capture); //釋放資源是個好習慣 delete ui; } void Dialog::getFrame(){ frame = cvQueryFrame(capture); //從攝像頭取幀 QImage image = QImage((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888).rgbSwapped(); //簡單地轉換一下為Image對象,rgbSwapped是為了顯示效果色彩好一些。 ui->label->setPixmap(QPixmap::fromImage(image)); }
效果:
工程源碼: