使用QT+OpenCV打开摄像头

Posted 西伯利亚鹰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用QT+OpenCV打开摄像头相关的知识,希望对你有一定的参考价值。

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

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

第一步:安装好opencv的库

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

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

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

         例如:

 

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

    1.头文件设置  Widget.h 

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

#include <QImage>
#include <QTimer>   // 设置采集数据的间隔时间
#include <highgui.h>  //包含opencv库头文件
#include <cv.h>

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

#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+OpenCV打开摄像头的主要内容,如果未能解决你的问题,请参考以下文章

使用QT+OpenCV打开摄像头

为啥我的直播摄像头严重滞后于 OpenCV+Qt [关闭]

Qt 视频采集

从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练

ffmpeg 捕捉摄像头 间隔

vs+qt+opencv海康摄像头实时预览