qt中用opencv读取视频并抓取图像

来源:互联网 发布:ubuntu 16.04镜像文件 编辑:程序博客网 时间:2024/04/26 16:48

因为学习各种其他的事情耽搁了好久,终于又开始qt的学习了!因此我又来记录了……

这一次的学习是如何用opencv打开摄像头抓取视频,并实现采集图像的功能。

首先建立Qt Widgets Application,配置好opencv,如何配置在之前的博客中说过了。在编程之前,在ui界面上添加按钮和显示屏
这里写图片描述

请忽略我还没有对齐的两个label……我还没有学习如何对齐……

三个按钮的名称(objectName)分别改为OpenCameraBtn、TakePicBtn、CloseCameraBtn

然后是代码部分了。
mainwindow.h中,添加的部分:需要的头文件,信号槽、新定义的参数。

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QPaintEvent>#include <QTimer>#include <QPainter>#include <QPixmap>#include <QLabel>#include <QImage>#include <QDebug>#include <opencv.hpp>#include "ui_mainwindow.h"using namespace cv;namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{    Q_OBJECTpublic:    explicit MainWindow(QWidget *parent = 0);    ~MainWindow();private slots:    void on_OpenCameraBtn_clicked();    void getFrame();    void on_TakePicBtn_clicked();    void on_CloseCameraBtn_clicked();private:    Ui::MainWindow *ui;    QImage *imag;    CvCapture *capture;//highgui里提供的一个专门处理摄像头图像的结构体    IplImage *frame;//摄像头每次抓取的图像为一帧,使用该指针指向一帧图像的内存空间    QTimer *timer;//定时器用于定时取帧,上面说的隔一段时间就去取就是用这个实现};#endif // MAINWINDOW_H

然后是mainwindow.cpp中,添加的部分:参数初始化、信号槽的连接和三个按钮的功能实现函数。

#include "mainwindow.h"#include "ui_mainwindow.h"#include <opencv2/opencv.hpp>using namespace cv;MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    ui->setupUi(this);    // 初始化    capture = NULL;    timer = new QTimer(this);    imag = new QImage();    /*信号和槽*/    connect(ui->OpenCameraBtn,SIGNAL(click()),this,SLOT(on_OpenCameraBtn_clicked()));//打开摄像头按钮    connect(timer, SIGNAL(timeout()), this, SLOT(getFrame()));//超时就读取当前摄像头信息    connect(ui->TakePicBtn,SIGNAL(click()),this,SLOT(on_TakePicBtn_clicked()));//拍照按钮}/****************************** ***********打开摄像头*********** *****************************/void MainWindow::on_OpenCameraBtn_clicked(){    capture = cvCreateCameraCapture(0);//打开摄像头,从摄像头中获取视频    if(capture==NULL)    {        qDebug()<<"error!";    }    timer->start(50);//开始计时,超时则发出timeout()信号,1000为1秒,50毫秒取一帧}void MainWindow::getFrame(){    frame = cvQueryFrame(capture);//从摄像头中抓取并返回每一帧    // 将抓取到的帧,从IplImage格式转换为QImage格式,rgbSwapped是为了显示效果色彩好一些    //QImage::Format_RGB888不同的摄像头用不同的格式。   QImage image = QImage((const uchar*)frame->imageData,                         frame->width, frame->height,                         QImage::Format_RGB888).rgbSwapped();    ui->label->setPixmap(QPixmap::fromImage(image));//将视频显示到label上}/****************************** ***********拍照按钮************ *****************************/void MainWindow::on_TakePicBtn_clicked(){    frame = cvQueryFrame(capture);//从摄像头中抓取并返回每一帧    // 将抓取到的帧,从IplImage格式转换为QImage格式,rgbSwapped是为了显示效果色彩好一些    //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));//将截取的图片显示到label2上}/****************************** ***********关闭摄像头*********** *****************************/void MainWindow::on_CloseCameraBtn_clicked(){    timer->stop(); //停止取帧    cvReleaseCapture(&capture); //释放资源}MainWindow::~MainWindow(){    delete ui;}

代码注释的很详细了哈,为了以后复习方便,现在麻烦一点也是值得的。

运行结果如下:
这里写图片描述

小胖手出境hiahia~
左边大一点的窗口是实时视频,右边小一点的窗口是点击拍照按钮后截取的图像(还是那句话,还不会对齐排版呢,我接下来就学它…)。当点击关闭摄像头按钮之后,视频那个窗口就定格在最后的显示画面了。

0 0
原创粉丝点击