使用QT+OpenCV打开摄像头

下载地址:https://download.csdn.net/download/sinat_35845281/11264826

注:包里面提供了本博客的全部资料

第一步:安装好opencv的库

         1.双击opencv-2.1-2008.exe安装到你想要的地址

第二步:创建好一个QT Widget 项目

    2.在项目的.pro文件中配置好的你opencv库

         例如:

使用QT+OpenCV打开摄像头_第1张图片

 

第三步:按照项目编辑你的代码

    1.头文件设置  Widget.h 

#ifndef WIDGET_H
#define WIDGET_H

#include 

#include 
#include    // 设置采集数据的间隔时间
#include   //包含opencv库头文件
#include 

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void openCamara();      // 打开摄像头
    void readFarme();       // 读取当前帧信息
    void closeCamara();     // 关闭摄像头。
    void takingPictures();  // 拍照

private:
    Ui::Widget *ui;

    QTimer    *timer;
    QImage    *imag;
    CvCapture *cam;// 视频获取结构, 用来作为视频获取函数的一个参数
    IplImage  *frame;//申请IplImage类型指针,就是申请内存空间来存放每一帧图像
};

#endif // WIDGET_H

  2. 实现.h中的方法在 Widget.cpp中

#include "widget.h"
#include "ui_widget.h"
#include 

#define cout qDebug() << "[ "<<__FILE__<<" : "<<__LINE__<<" ]"

#define camerawidth 1280
#define cameraheight 720


Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    cam     = NULL;
    timer   = new QTimer(this);
    imag    = new QImage();         // 初始化

    /*信号和槽*/
    connect(timer,&QTimer::timeout,this,&Widget::readFarme);// 时间到,读取当前摄像头信息
    connect(ui->pushButton_open,&QPushButton::clicked,this,&Widget::openCamara); //打开摄像头
    connect(ui->pushButton_photo,&QPushButton::clicked,this,&Widget::takingPictures);//照相
    connect(ui->pushButton_close,&QPushButton::clicked,this,&Widget::closeCamara);    //关闭摄像头



}

Widget::~Widget()
{
    closeCamara();
    delete ui;
}

/******************************
********* 打开摄像头 ***********
*******************************/
void Widget::openCamara()
{
   cam = cvCreateCameraCapture(0);//打开摄像头,从摄像头中获取视频
   timer->start(33);        // 开始计时,超时则发出timeout()信号

    cout << "打开摄像头";
}

/*********************************
********* 读取摄像头信息 ***********
**********************************/
void Widget::readFarme()
{
    frame = cvQueryFrame(cam);  // 从摄像头中抓取并返回每一帧
    // 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
    QImage image = QImage((const uchar *)frame->imageData,
                          camerawidth,
                          cameraheight,
                          QImage::Format_RGB888).rgbSwapped();
    //因为 frame 取出来的是镜像图片,水平方向上是左右颠倒的,
    //所以使用 mirrored 将 水平方向的图片 再次镜像回来,显示就正确了
    ui->label_camera->setPixmap(QPixmap::fromImage(image.mirrored(true,false)));
      cout << "读取摄像头信息";
}


/*************************
********* 拍照 ***********
**************************/
void Widget::takingPictures()
{
    frame = cvQueryFrame(cam);  // 从摄像头中抓取并返回每一帧
    // 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
    QImage image = QImage((const uchar *)frame->imageData,
                          camerawidth,
                          cameraheight,
                          QImage::Format_RGB888).rgbSwapped();
    ui->label_image->setPixmap(QPixmap::fromImage(image.mirrored(true,false)));
    cout << "拍照";
}

/*******************************
***关闭摄像头,释放资源,必须释放***
********************************/
void Widget::closeCamara()
{
    timer->stop();          // 停止读取数据。
    cvReleaseCapture(&cam);//释放内存;
    cout << "关闭摄像头,释放资源,必须释放";
}

最后就是编译运行了。谢谢大家,有问题可以在下方提问,看到了就会及时的回复。

你可能感兴趣的:(QT)