Qt+OpenCV摄像头读取保存回放视频

上一篇文章中,在Qt中配置了OpenCV的开发环境,并且添加了所需要的库文件,这篇文章,开始读取摄像头视频,并保存

要注意OpenCV2和OpenCV3的读取保存方法是有区别的,本文是基于OpenCV3的方法进行视频读取与保存

参考:http://blog.csdn.net/sinat_24206709/article/details/53152966

一、读取单个摄像头视频

在mainwindow.cpp中添加如下代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    Mat input_image;
    VideoCapture cam(0);
    if (!cam.isOpened()) exit(0);
    namedWindow("摄像头");
    while (true) 
    {
        cam >> input_image;
        imshow("input image", input_image);
        if (27 == waitKey(30))
            break;
    }
}
MainWindow::~MainWindow()
{
    delete ui;
}

运行后即可打开笔记本摄像头,并显示视频数据

如果有别的摄像头,可以插入,然后修改VideoCapture cam(0)中的0为1、2....即可

二、保存视频

在UI界面添加打开摄像头、保存视频、关闭摄像头、打开视频的按钮,效果如图所示

为了实现保存视频的功能,添加了定时器,实现隔一段时间来读取一帧,然后保存的效果,代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/video.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    timer = new QTimer(this);
    cam = NULL;
    OPEN = true;
    /*信号和槽*/
    connect(ui->OpenCameraBtn,SIGNAL(click()),this,SLOT(on_OpenCameraBtn_clicked()));//打开摄像头按钮
    connect(ui->TakePicBtn,SIGNAL(click()),this,SLOT(on_TakePicBtn_clicked()));//保存视频按钮
    connect(ui->CloseCameraBtn,SIGNAL(click()),this,SLOT(on_CloseCameraBtn_clicked()));//关闭摄像头按钮
    connect(ui->OpenVideoBtn,SIGNAL(click()),this,SLOT(on_OpenVideoBtn_clicked()));//打开视频按钮
    connect(timer,SIGNAL(timeout()),this,SLOT(getFrame()));
}
/******************************
 ***********打开摄像头***********
 *****************************/
void MainWindow::on_OpenCameraBtn_clicked()
{
    // 设置摄像头的拍摄属性为 分辨率640x480,帧率30fps
//    cam.set(CAP_PROP_FRAME_HEIGHT, 480);
//    cam.set(CAP_PROP_FRAME_WIDTH, 640);
//    cam.set(CAP_PROP_FPS, 30.0);
    //打开摄像头 从摄像头中获取视频
    cam.open(0);
    //开启定时器,每隔0.05秒刷新一次
    timer->start(50);
}
void MainWindow::getFrame()
{
   //读取摄像头信息 将读取回来的帧转换成QImage类型
   //从摄像头中抓取并返回每一帧
   cam >> frame;
   //将抓取到的帧转换成QImage格式
   QImage img1 = QImage((const unsigned char*)frame.data, frame.cols, frame.rows, QImage::Format_RGB888).rgbSwapped();//个人测试时可以试试去掉.rgbSwapped()后的效果
   //将图片显示到QLabel上
   //ui->label->setPixmap(QPixmap::fromImage(img1));
   namedWindow("VideoPlay", WINDOW_NORMAL);
   imshow("VideoPlay", frame);
   waitKey(1000 / 30);
}
/******************************
 ***********保存视频按钮************
 *****************************/
void MainWindow::on_TakePicBtn_clicked()
{
    if(!cam.isOpened())
        cam.open(0);
    //VideoWriter write("D:\\test.avi", VideoWriter::fourcc('M', 'J', 'P', 'G'), 30.0, Size(640, 480), true);
    write.open("D:\\test.avi",VideoWriter::fourcc('M', 'J', 'P', 'G'), 30.0, Size(640, 480), true);
    while(OPEN)
    {
        cam >> frame;
        //设置保存视频的格式为AVI,编码为MJPG
        write.write(frame);        
        namedWindow("VideoPlay", WINDOW_NORMAL);
        imshow("VideoPlay", frame);
        waitKey(1000 / 30);
    }
}

三、关闭摄像头

/******************************
 ***********关闭摄像头***********
 *****************************/
void MainWindow::on_CloseCameraBtn_clicked()
{
    timer->stop();
    cam.release();
    OPEN = false;
    write.release();
    destroyWindow("VideoPlay");
}

四、打开保存的视频

/******************************
 ***********打开视频***********
 *****************************/
void MainWindow::on_OpenVideoBtn_clicked()
{
    VideoCapture video;
    Mat frame2;
    video.open("D:\\test.avi");
    while (video.isOpened())
    {
        video >> frame2;
        imshow("video", frame2);
        if (cvWaitKey(40) == 27)  //cvWaitKey的参数相当于多少ms一帧,现在是40ms一帧,1s25帧
            break;                //按ESC就退出
    }
}
MainWindow::~MainWindow()
{
    delete ui;
}

五、在mainwindow.h中添加槽函数和类的声明

private slots:
    void on_OpenCameraBtn_clicked();
    void getFrame();
    void on_TakePicBtn_clicked();
    void on_CloseCameraBtn_clicked();
    void on_OpenVideoBtn_clicked();
private:
    Ui::MainWindow *ui;
    Mat frame;//摄像头每次抓取的图像为一帧,使用该指针指向一帧图像的内存空间
    QTimer *timer;//定时器用于定时取帧,上面说的隔一段时间就去取就是用这个实现
    VideoCapture cam;
    VideoWriter write;
    bool OPEN;

 

 
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页