QT +openCV 實現網路攝影機採集以及拍照功能

來源:互聯網
上載者:User

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?
  1. #ifndef CAMARAGET_H 
  2. #define CAMARAGET_H 
  3.  
  4. #include <QWidget> 
  5. #include <QImage> 
  6. #include <QTimer>     // 設定採集資料的間隔時間 
  7.  
  8. #include <highgui.h>  //包含opencv庫標頭檔 
  9. #include <cv.h> 
  10.  
  11. namespace Ui { 
  12.     class camaraGet; 
  13.  
  14. class camaraGet :
    public QWidget 
  15.     Q_OBJECT 
  16.  
  17. public: 
  18.     explicit camaraGet(QWidget *parent = 0); 
  19.     ~camaraGet(); 
  20.  
  21. private slots: 
  22.     void openCamara();      // 開啟網路攝影機 
  23.     void readFarme();      
    // 讀取當前幀資訊 
  24.     void closeCamara();     // 關閉網路攝影機。 
  25.     void takingPictures(); 
    // 拍照 
  26.  
  27. private: 
  28.     Ui::camaraGet *ui; 
  29.     QTimer    *timer; 
  30.     QImage    *imag; 
  31.     CvCapture *cam;// 視頻擷取結構, 用來作為視頻擷取函數的一個參數 
  32.     IplImage  *frame;//申請IplImage類型指標,就是申請記憶體空間來存放每一幀映像 
  33. }; 
  34.  
  35. #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?
  1. #include "camaraget.h" 
  2. #include "ui_camaraget.h" 
  3.  
  4. camaraGet::camaraGet(QWidget *parent) : 
  5.     QWidget(parent), 
  6.     ui(new Ui::camaraGet) 
  7.     ui->setupUi(this); 
  8.  
  9.     cam     = NULL; 
  10.     timer   = new QTimer(this); 
  11.     imag    = new QImage();        
    // 初始化 
  12.  
  13.     /*訊號和槽*/ 
  14.     connect(timer, SIGNAL(timeout()),
    this, SLOT(readFarme()));  // 時間到,讀取當前網路攝影機資訊 
  15.     connect(ui->open, SIGNAL(clicked()), this, SLOT(openCamara())); 
  16.     connect(ui->pic, SIGNAL(clicked()),
    this, SLOT(takingPictures())); 
  17.     connect(ui->closeCam, SIGNAL(clicked()), this, SLOT(closeCamara())); 
  18.  
  19. /******************************
  20. ********* 開啟網路攝影機 ***********
  21. *******************************/ 
  22. void camaraGet::openCamara() 
  23.     cam = cvCreateCameraCapture(0);//開啟網路攝影機,從網路攝影機中擷取視頻 
  24.  
  25.     timer->start(33);              // 開始計時,逾時則發出timeout()訊號 
  26.  
  27. /*********************************
  28. ********* 讀取網路攝影機資訊 ***********
  29. **********************************/ 
  30. void camaraGet::readFarme() 
  31.     frame = cvQueryFrame(cam);// 從網路攝影機中抓取並返回每一幀 
  32.     // 將抓取到的幀,轉換為QImage格式。QImage::Format_RGB888不同的網路攝影機用不同的格式。 
  33.     QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888); 
  34.     ui->label->setPixmap(QPixmap::fromImage(image)); 
    // 將圖片顯示到label上 
  35.  
  36. /*************************
  37. ********* 拍照 ***********
  38. **************************/ 
  39. void camaraGet::takingPictures() 
  40.     frame = cvQueryFrame(cam);// 從網路攝影機中抓取並返回每一幀 
  41.  
  42.     // 將抓取到的幀,轉換為QImage格式。QImage::Format_RGB888不同的網路攝影機用不同的格式。 
  43.     QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888); 
  44.  
  45.     ui->label_2->setPixmap(QPixmap::fromImage(image)); 
    // 將圖片顯示到label上 
  46.  
  47. /*******************************
  48. ***關閉網路攝影機,釋放資源,必須釋放***
  49. ********************************/ 
  50. void camaraGet::closeCamara() 
  51.     timer->stop();         // 停止讀取資料。 
  52.  
  53.     cvReleaseCapture(&cam);//釋放記憶體; 
  54.  
  55. camaraGet::~camaraGet() 
  56.     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?
  1. 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?
  1. 改為了 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();

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.