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

    xiaoxiao2021-04-14  37

    因为学习各种其他的事情耽搁了好久,终于又开始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_OBJECT public: 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~ 左边大一点的窗口是实时视频,右边小一点的窗口是点击拍照按钮后截取的图像(还是那句话,还不会对齐排版呢,我接下来就学它…)。当点击关闭摄像头按钮之后,视频那个窗口就定格在最后的显示画面了。

    转载请注明原文地址: https://ju.6miu.com/read-669917.html

    最新回复(0)