现在的位置: 首页 > 综合 > 正文

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

2013年10月02日 ⁄ 综合 ⁄ 共 2266字 ⁄ 字号 评论关闭

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

例子:

UI:

头文件:

#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上 
}

抱歉!评论已关闭.