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

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 文件

  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_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

编辑 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.     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中点击打开摄像头,就可以看到自己了。运行后的效果:




后来我发现这个效果不怎么好,就改了一下:改了以后的运行效果也贴出来:


就改了一句:

  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);
  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();



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值