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