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