在Qt中使用OpenCV做视频播放器

时间:2022-08-31 22:53:08

OpenCV中文网站:http://www.opencv.org.cn/index.php/%E5%9C%A8Qt%E4%B8%AD%E4%BD%BF%E7%94%A8OpenCV%E5%BA%93


例子:

UI:

在Qt中使用OpenCV做视频播放器

头文件:

#ifndef CAMARAGET_H
#define CAMARAGET_H

#include <QtGui/QWidget>
#include <QImage>
#include <QTimer> // 设置采集数据的间隔时间

#include <highgui.h> //包含opencv库头文件
#include <cv.h>

#include "ui_camaraget.h"

class camaraget : public QWidget
{
Q_OBJECT

public:
camaraget(QWidget *parent = 0, Qt::WFlags flags = 0);
~camaraget();

signals:
void sig_sendImage(const QByteArray&);

private slots:
void slot_openCamara(); // 打开摄像头
void slot_readFarme(); // 读取当前帧信息
void slot_closeCamara(); // 关闭摄像头。
void slot_takingPictures(); // 拍照

private:
Ui::camaragetClass ui;
QTimer *timer;
QImage *imag;
CvCapture *cam;// 视频获取结构, 用来作为视频获取函数的一个参数
IplImage *frame;//申请IplImage类型指针


源文件:

#include "camaraget.h"

#include <QTime>
#include <QBuffer>
#include <QDebug>

camaraget::camaraget(QWidget *parent, Qt::WFlags flags)
: QWidget(parent, flags)
{
ui.setupUi(this);

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

/*信号和槽*/
connect(timer, SIGNAL(timeout()), this, SLOT(slot_readFarme())); // 时间到,读取当前摄像头信息
connect(ui.btn_open, SIGNAL(clicked()), this, SLOT(slot_openCamara()));
connect(ui.btn_pic, SIGNAL(clicked()), this, SLOT(slot_takingPictures()));
connect(ui.btn_closeCam, SIGNAL(clicked()), this, SLOT(slot_closeCamara()));
}

camaraget::~camaraget()
{

}

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

void camaraget::slot_readFarme()
{
frame = cvQueryFrame(cam);// 从摄像头中抓取并返回每一帧
if(frame == NULL)
return;

// 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
QImage image = QImage((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888).rgbSwapped();
if(image.isNull())
{
qDebug()<<"Image is null! *******";
}
else
{
ui.label->setPixmap(QPixmap::fromImage(image)); // 将图片显示到label上

QByteArray ba;
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
image.save(&buffer, "JPG"); // writes image into ba in JPG format

emit sig_sendImage(ba);
}
}

void camaraget::slot_closeCamara()
{
timer->stop();// 停止读取数据。
cvReleaseCapture(&cam);// 释放内存;
}

void camaraget::slot_takingPictures()
{
frame = cvQueryFrame(cam);// 从摄像头中抓取并返回每一帧

// 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
QImage image = QImage((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888).rgbSwapped();
ui.label_2->setPixmap(QPixmap::fromImage(image)); // 将图片显示到label上
}