Qt: QT + openCV 实现摄像头采集以及拍照功能

今天写的QT+openCV实现摄像头拍照功能。


在网上收罗了很多资料,QT没有专门操作摄像头的类,这个得自己写。网上也有很多关务openCV和V4l的一些介绍,由于我项目要在window下开发,所以就选择了openCV。http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.1/  刚开始下载的是2.3.1的,安装后发现没有lib库所以后面选择了2.1的。


现在,开始详细的介绍如何在QT中实时的采集摄像头数据。

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

新建一个widget工程


界面上放两个label 分别用来显示摄像头采集到的数据和照的照片。


编辑camaraget.h 文件

[cpp]  view plain copy
  1. #ifndef CAMARAGET_H  
  2. #define CAMARAGET_H  
  3.   
  4. #include   
  5. #include   
  6. #include      // 设置采集数据的间隔时间  
  7.   
  8. #include   //包含opencv库头文件  
  9. #include   
  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();       // 读取当前帧信息  
  26.     void closeCamara();     // 关闭摄像头。  
  27.     void takingPictures();  // 拍照  
  28.   
  29. private:  
  30.     Ui::camaraGet *ui;  
  31.     QTimer    *timer;  
  32.     QImage    *imag;  
  33.     CvCapture *cam;// 视频获取结构, 用来作为视频获取函数的一个参数  
  34.     IplImage  *frame;//申请IplImage类型指针,就是申请内存空间来存放每一帧图像  
  35. };  
  36.   
  37. #endif // CAMARAGET_H  

编辑 camaraget .cpp
[cpp]  view plain copy
  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()));  // 时间到,读取当前摄像头信息  
  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);              // 开始计时,超时则发出timeout()信号  
  29. }  
  30.   
  31. /********************************* 
  32. ********* 读取摄像头信息 *********** 
  33. **********************************/  
  34. void camaraGet::readFarme()  
  35. {  
  36.     frame = cvQueryFrame(cam);// 从摄像头中抓取并返回每一帧  
  37.     // 将抓取到的帧,转换为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.     // 将抓取到的帧,转换为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. ***关闭摄像头,释放资源,必须释放*** 
  57. ********************************/  
  58. void camaraGet::closeCamara()  
  59. {  
  60.     timer->stop();         // 停止读取数据。  
  61.   
  62.     cvReleaseCapture(&cam);//释放内存;  
  63. }  
  64.   
  65. camaraGet::~camaraGet()  
  66. {  
  67.     delete ui;  
  68. }  

好了,全部代码都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 plain copy
  1. QImage image((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888);  
[cpp]  view plain copy
  1. 改为了 QImage image = QImage((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888).rgbSwapped();  



FROM: http://blog.chinaunix.net/uid-23381466-id-3826748.html



  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值