小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

QT openCV 實現(xiàn)攝像頭采集以及拍照功能

 Ethan的博客 2012-02-21

      今天寫的QT+openCV實現(xiàn)攝像頭拍照功能。

在網(wǎng)上收羅了很多資料,QT沒有專門操作攝像頭的類,這個得自己寫。網(wǎng)上也有很多關(guān)務(wù)openCV和V4l的一些介紹,由于我項目要在window下開發(fā),所以就選擇了openCV。由于以前沒有用過openCV,所以就只看了關(guān)于openCVS攝像頭操作的這部分,其他的還沒時間去看。

openCV : http:///projects/opencvlibrary/files/opencv-win/2.1/  

剛開始下載的是2.3.1的,安裝后發(fā)現(xiàn)沒有l(wèi)ib庫所以后面選擇了2.1的

openCV中文學(xué)習(xí) pdf  :

現(xiàn)在,開始詳細(xì)的介紹如何在QT中實時的采集攝像頭數(shù)據(jù)。

打開QTcreator (我用的是QT 2.3的 中文版)

新建一個widget工程


界面上放兩個label 分別用來顯示攝像頭采集到的數(shù)據(jù)和照的照片。




編輯camaraget.h 文件

  1. #ifndef CAMARAGET_H   
  2. #define CAMARAGET_H   
  3.   
  4. #include <QWidget>   
  5. #include <QImage>   
  6. #include <QTimer>     // 設(shè)置采集數(shù)據(jù)的間隔時間   
  7.   
  8. #include <highgui.h>  //包含opencv庫頭文件   
  9. #include <cv.h>   
  10.   
  11. namespace Ui {  
  12.     class camaraGet;  
  13. }  
  14.   
  15. class camaraGet : public QWidget  
  16. {  
  17.     Q_OBJECT  
  18.   
  19. public:  
  20.     explicit camaraGet(QWidget *parent = 0);  
  21.     ~camaraGet();  
  22.   
  23. private slots:  
  24.     void openCamara();      // 打開攝像頭   
  25.     void readFarme();       // 讀取當(dāng)前幀信息   
  26.     void closeCamara();     // 關(guān)閉攝像頭。   
  27.     void takingPictures();  // 拍照   
  28.   
  29. private:  
  30.     Ui::camaraGet *ui;  
  31.     QTimer    *timer;  
  32.     QImage    *imag;  
  33.     CvCapture *cam;// 視頻獲取結(jié)構(gòu), 用來作為視頻獲取函數(shù)的一個參數(shù)   
  34.     IplImage  *frame;//申請IplImage類型指針,就是申請內(nèi)存空間來存放每一幀圖像   
  35. };  
  36.   
  37. #endif // CAMARAGET_H  

編輯camaraget.cpp

  1. #include "camaraget.h"   
  2. #include "ui_camaraget.h"   
  3.   
  4. camaraGet::camaraGet(QWidget *parent) :  
  5.     QWidget(parent),  
  6.     ui(new Ui::camaraGet)  
  7. {  
  8.     ui->setupUi(this);  
  9.   
  10.     cam     = NULL;  
  11.     timer   = new QTimer(this);  
  12.     imag    = new QImage();         // 初始化   
  13.   
  14.     /*信號和槽*/  
  15.     connect(timer, SIGNAL(timeout()), this, SLOT(readFarme()));  // 時間到,讀取當(dāng)前攝像頭信息   
  16.     connect(ui->open, SIGNAL(clicked()), this, SLOT(openCamara()));  
  17.     connect(ui->pic, SIGNAL(clicked()), this, SLOT(takingPictures()));  
  18.     connect(ui->closeCam, SIGNAL(clicked()), this, SLOT(closeCamara()));  
  19. }  
  20.   
  21. /****************************** 
  22. ********* 打開攝像頭 *********** 
  23. *******************************/  
  24. void camaraGet::openCamara()  
  25. {  
  26.     cam = cvCreateCameraCapture(0);//打開攝像頭,從攝像頭中獲取視頻   
  27.   
  28.     timer->start(33);              // 開始計時,超時則發(fā)出timeout()信號   
  29. }  
  30.   
  31. /********************************* 
  32. ********* 讀取攝像頭信息 *********** 
  33. **********************************/  
  34. void camaraGet::readFarme()  
  35. {  
  36.     frame = cvQueryFrame(cam);// 從攝像頭中抓取并返回每一幀   
  37.     // 將抓取到的幀,轉(zhuǎn)換為QImage格式。QImage::Format_RGB888不同的攝像頭用不同的格式。   
  38.     QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888);  
  39.     ui->label->setPixmap(QPixmap::fromImage(image));  // 將圖片顯示到label上   
  40. }  
  41.   
  42. /************************* 
  43. ********* 拍照 *********** 
  44. **************************/  
  45. void camaraGet::takingPictures()  
  46. {  
  47.     frame = cvQueryFrame(cam);// 從攝像頭中抓取并返回每一幀   
  48.   
  49.     // 將抓取到的幀,轉(zhuǎn)換為QImage格式。QImage::Format_RGB888不同的攝像頭用不同的格式。   
  50.     QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888);  
  51.   
  52.     ui->label_2->setPixmap(QPixmap::fromImage(image));  // 將圖片顯示到label上   
  53. }  
  54.   
  55. /******************************* 
  56. ***關(guān)閉攝像頭,釋放資源,必須釋放*** 
  57. ********************************/  
  58. void camaraGet::closeCamara()  
  59. {  
  60.     timer->stop();         // 停止讀取數(shù)據(jù)。   
  61.   
  62.     cvReleaseCapture(&cam);//釋放內(nèi)存;   
  63. }  
  64.   
  65. camaraGet::~camaraGet()  
  66. {  
  67.     delete ui;  
  68. }  

好了,全部代碼都OK了(當(dāng)然,創(chuàng)建工程時,會生成main.cpp,不必去改動它),但現(xiàn)在你點(diǎn)運(yùn)行,依然會產(chǎn)生錯誤,為什么呢?因為還沒有把openCV的庫包含進(jìn)去。

在*.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,大功告成,運(yùn)行后,在widget中點(diǎn)擊打開攝像頭,就可以看到自己了。運(yùn)行后的效果:




后來我發(fā)現(xiàn)這個效果不怎么好,就改了一下:改了以后的運(yùn)行效果也貼出來:


就改了一句:

  1. QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888);  
  1. 改為了 QImage image = QImage((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888).rgbSwapped();  



    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多