当用到opencv与Qt结合时候,需要用Qt的UI显示opencv的结果或者效果,所以以下做了简单的Qt的UI。在这之前用Qt的capture总是找不到如何获取摄像头的帧,但是opencv的方法很简单就可以获取摄像的帧,方便实时处理图像信息。
以下是代码:
mianwindow.h代码:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "cv.h"
#include "highgui.h"
#include <QTime>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void cameraopen();
//声明函数
private:
Ui::MainWindow *ui;
QTimer *timer;
//QTimer 计时用;
IplImage* pFrame;
//申请IplImage类型指针,就是申请内存空间来存放每一帧图像
CvCapture *cam;
// 视频获取结构, 用来作为视频获取函数的一个参数
};
#endif // MAINWINDOW_H
mianwindow.cpp代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTimer>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
timer = new QTimer(this);
//初始化timer
cam = NULL;
// 初始化cam
connect(timer, SIGNAL(timeout()), this, SLOT(cameraopen()));
// 时间到,读取当前摄像头信息,这个必须加,因为timer需要配合timeout()信号用
//没有的话会出现错误;
//另外注意自己有没有野指针,有的话常常会
//出现Program Files (x86)\SogouInput\7.2.0.2124\程序异常终止,这样的错误
}
MainWindow::~MainWindow()
{
delete ui;
cvReleaseCapture(&cam);
//释放内存;
}
void MainWindow::cameraopen()
{
pFrame = cvQueryFrame(cam);
// 从摄像头中抓取并返回每一帧
QImage image((const uchar*)pFrame->imageData, pFrame->width, pFrame->height,QImage::Format_RGB888);
// 将抓取到的帧,转换为QImage格式。QImage::Format_RGB888不同的摄像头用不同的格式。
QGraphicsScene *scene = new QGraphicsScene;
//创建图片显示方式的容器
scene->addPixmap(QPixmap::fromImage(image));
//装载图片
ui->graphicsView->setScene(scene);
//显示图片,自动添加滚动条
ui->graphicsView->show();
//显示图片
}
void MainWindow::on_pushButton_clicked()
{
cam = cvCreateCameraCapture(0);
//打开摄像头,从摄像头中获取视频
timer->start(33);
// 开始计时,超时则发出timeout()信号
}
void MainWindow::on_pushButton_2_clicked()
{
timer->stop();
// 停止读取数据。
cvReleaseCapture(&cam);
//释放内存;
}
显示效果: