QT creator中使用opencv采集摄像头信息

时间:2023-03-08 18:14:25
QT creator中使用opencv采集摄像头信息

之前在QT creator上成功编译了opencv,由于课题需要,需要采集摄像头的信息。故搜集了网上的一些资料,依葫芦画瓢的照着做了一下,终于简单的成功采集了信息。

打开QTcreator,新建一个widget工程。

QT creator中使用opencv采集摄像头信息

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

QT creator中使用opencv采集摄像头信息

在widget.h中的源代码如下:

#ifndef WIDGET_H

#define WIDGET_H
#include <QWidget>
#include <QImage>
#include <QTimer> //设置采集数据的间隔时间
#include <highgui.h>
#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

在widget.cpp中的源文件如下:

#include "widget.h"

#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    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->close,SIGNAL(clicked()),this,SLOT(closeCamara()));
}
Widget::~Widget()
{
    delete ui;
}
void Widget::openCamara()
{
    cam=cvCreateCameraCapture(0);
    timer->start(33);
}
void Widget::readFarme()
{
    frame=cvQueryFrame(cam);
  //  QImage imag((const uchar*)frame->imageData,frame->width,frame->height,QImage::Format_RGB888);
    QImage imag=QImage((const uchar*)frame->imageData,frame->width,frame->height,QImage::Format_RGB888).rgbSwapped();
    ui->label->setPixmap(QPixmap::fromImage(imag));
}
void Widget::closeCamara()
{
    timer->stop();
    cvReleaseCapture(&cam);//释放内存;
}

void Widget::takingPictures()
{
   frame = cvQueryFrame(cam);
   QImage imag((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888);
   ui->label_2->setPixmap(QPixmap::fromImage(imag));
}

好了,全部代码都OK了。

(大致思路是:点击打开摄像头按钮,则开启摄像头,并设置一个定时器,每隔一段时间捕获摄像头摄取到的帧,将其转换成QImage,最最后在QLabel控件上显示)