http://blog.csdn.net/llh318724/article/details/7007661
在網上收羅了很多資料,QT沒有專門操作網路攝影機的類,這個得自己寫。網上也有很多關務openCV和V4l的一些介紹,由於我項目要在window下開發,所以就選擇了openCV。由於以前沒有用過openCV,所以就只看了關於openCVS網路攝影機操作的這部分,其他的還沒時間去看。
openCV : http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.1/
剛開始下載的是2.3.1的,安裝後發現沒有lib庫所以後面選擇了2.1的
openCV中文學習 pdf :
現在,開始詳細的介紹如何在QT中即時的採集網路攝影機資料。
開啟QTcreator (我用的是QT 2.3的 中文版)
建立一個widget工程
在介面上放兩個label 分別用來顯示網路攝影機採集到的資料和照的照片。
編輯camaraget.h 檔案
[cpp]
view plaincopyprint?
- #ifndef CAMARAGET_H
- #define CAMARAGET_H
-
- #include <QWidget>
- #include <QImage>
- #include <QTimer> // 設定採集資料的間隔時間
-
- #include <highgui.h> //包含opencv庫標頭檔
- #include <cv.h>
-
- namespace Ui {
- class camaraGet;
- }
-
- class camaraGet :
public QWidget
- {
- Q_OBJECT
-
- public:
- explicit camaraGet(QWidget *parent = 0);
- ~camaraGet();
-
- private slots:
- void openCamara(); // 開啟網路攝影機
- void readFarme();
// 讀取當前幀資訊
- void closeCamara(); // 關閉網路攝影機。
- void takingPictures();
// 拍照
-
- private:
- Ui::camaraGet *ui;
- QTimer *timer;
- QImage *imag;
- CvCapture *cam;// 視頻擷取結構, 用來作為視頻擷取函數的一個參數
- IplImage *frame;//申請IplImage類型指標,就是申請記憶體空間來存放每一幀映像
- };
-
- #endif // CAMARAGET_H
#ifndef CAMARAGET_H#define CAMARAGET_H#include <QWidget>#include <QImage>#include <QTimer> // 設定採集資料的間隔時間#include <highgui.h> //包含opencv庫標頭檔#include <cv.h>namespace Ui { class camaraGet;}class camaraGet : public QWidget{ Q_OBJECTpublic: explicit camaraGet(QWidget *parent = 0); ~camaraGet();private slots: void openCamara(); // 開啟網路攝影機 void readFarme(); // 讀取當前幀資訊 void closeCamara(); // 關閉網路攝影機。 void takingPictures(); // 拍照private: Ui::camaraGet *ui; QTimer *timer; QImage *imag; CvCapture *cam;// 視頻擷取結構, 用來作為視頻擷取函數的一個參數 IplImage *frame;//申請IplImage類型指標,就是申請記憶體空間來存放每一幀映像};#endif // CAMARAGET_H
編輯camaraget.cpp
[cpp]
view plaincopyprint?
- #include "camaraget.h"
- #include "ui_camaraget.h"
-
- camaraGet::camaraGet(QWidget *parent) :
- QWidget(parent),
- ui(new Ui::camaraGet)
- {
- ui->setupUi(this);
-
- cam = NULL;
- timer = new QTimer(this);
- imag = new QImage();
// 初始化
-
- /*訊號和槽*/
- connect(timer, SIGNAL(timeout()),
this, SLOT(readFarme())); // 時間到,讀取當前網路攝影機資訊
- connect(ui->open, SIGNAL(clicked()), this, SLOT(openCamara()));
- connect(ui->pic, SIGNAL(clicked()),
this, SLOT(takingPictures()));
- connect(ui->closeCam, SIGNAL(clicked()), this, SLOT(closeCamara()));
- }
-
- /******************************
- ********* 開啟網路攝影機 ***********
- *******************************/
- void camaraGet::openCamara()
- {
- cam = cvCreateCameraCapture(0);//開啟網路攝影機,從網路攝影機中擷取視頻
-
- timer->start(33); // 開始計時,逾時則發出timeout()訊號
- }
-
- /*********************************
- ********* 讀取網路攝影機資訊 ***********
- **********************************/
- void camaraGet::readFarme()
- {
- frame = cvQueryFrame(cam);// 從網路攝影機中抓取並返回每一幀
- // 將抓取到的幀,轉換為QImage格式。QImage::Format_RGB888不同的網路攝影機用不同的格式。
- QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888);
- ui->label->setPixmap(QPixmap::fromImage(image));
// 將圖片顯示到label上
- }
-
- /*************************
- ********* 拍照 ***********
- **************************/
- void camaraGet::takingPictures()
- {
- frame = cvQueryFrame(cam);// 從網路攝影機中抓取並返回每一幀
-
- // 將抓取到的幀,轉換為QImage格式。QImage::Format_RGB888不同的網路攝影機用不同的格式。
- QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888);
-
- ui->label_2->setPixmap(QPixmap::fromImage(image));
// 將圖片顯示到label上
- }
-
- /*******************************
- ***關閉網路攝影機,釋放資源,必須釋放***
- ********************************/
- void camaraGet::closeCamara()
- {
- timer->stop(); // 停止讀取資料。
-
- cvReleaseCapture(&cam);//釋放記憶體;
- }
-
- camaraGet::~camaraGet()
- {
- delete ui;
- }
#include "camaraget.h"#include "ui_camaraget.h"camaraGet::camaraGet(QWidget *parent) : QWidget(parent), ui(new Ui::camaraGet){ ui->setupUi(this); cam = NULL; timer = new QTimer(this); imag = new QImage(); // 初始化 /*訊號和槽*/ connect(timer, SIGNAL(timeout()), this, SLOT(readFarme())); // 時間到,讀取當前網路攝影機資訊 connect(ui->open, SIGNAL(clicked()), this, SLOT(openCamara())); connect(ui->pic, SIGNAL(clicked()), this, SLOT(takingPictures())); connect(ui->closeCam, SIGNAL(clicked()), this, SLOT(closeCamara()));}/*************************************** 開啟網路攝影機 ******************************************/void camaraGet::openCamara(){ cam = cvCreateCameraCapture(0);//開啟網路攝影機,從網路攝影機中擷取視頻 timer->start(33); // 開始計時,逾時則發出timeout()訊號}/****************************************** 讀取網路攝影機資訊 *********************************************/void camaraGet::readFarme(){ frame = cvQueryFrame(cam);// 從網路攝影機中抓取並返回每一幀 // 將抓取到的幀,轉換為QImage格式。QImage::Format_RGB888不同的網路攝影機用不同的格式。 QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888); ui->label->setPixmap(QPixmap::fromImage(image)); // 將圖片顯示到label上}/********************************** 拍照 *************************************/void camaraGet::takingPictures(){ frame = cvQueryFrame(cam);// 從網路攝影機中抓取並返回每一幀 // 將抓取到的幀,轉換為QImage格式。QImage::Format_RGB888不同的網路攝影機用不同的格式。 QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888); ui->label_2->setPixmap(QPixmap::fromImage(image)); // 將圖片顯示到label上}/**********************************關閉網路攝影機,釋放資源,必須釋放***********************************/void camaraGet::closeCamara(){ timer->stop(); // 停止讀取資料。 cvReleaseCapture(&cam);//釋放記憶體;}camaraGet::~camaraGet(){ delete ui;}
好了,全部代碼都OK了(當然,建立工程時,會產生main.cpp,不必去改動它),但現在你點運行,依然會產生錯誤,為什麼呢?因為還沒有把openCV的庫包含進去。
在*.pro 檔案中 加入:
INCLUDEPATH+=C:\OpenCV2.1\include\opencv
LIBS += C:\OpenCV2.1\lib\highgui210.lib \
C:\OpenCV2.1\lib\cxcore210.lib \
C:\OpenCV2.1\lib\cv210.lib
OK,大功告成,運行後,在widget中點擊開啟網路攝影機,就可以看到自己了。運行後的效果:
後來我發現這個效果不怎麼好,就改了一下:改了以後的運行效果也貼出來:
就改了一句:
[cpp]
view plaincopyprint?
- QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888);
QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888);
[cpp]
view plaincopyprint?
- 改為了 QImage image = QImage((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888).rgbSwapped();
改為了 QImage image = QImage((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888).rgbSwapped();