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

1、函数:

函数原型:
在这里插入图片描述
参数:

。第一个参数:输出视频文件名,可以指定输出路径
。第二个参数:用于压缩帧的编码器的4个字符的代码,如:
CV_FOURCC(‘P’,‘I’,‘M’,‘1’) = MPEG-1 codec
CV_FOURCC(‘M’,‘J’,‘P’,‘G’) = motion-jpeg codec
CV_FOURCC(‘M’, ‘P’, ‘4’, ‘2’) = MPEG-4.2 codec
CV_FOURCC(‘D’, ‘I’, ‘V’, ‘3’) = MPEG-4.3 codec
CV_FOURCC(‘D’, ‘I’, ‘V’, ‘X’) = MPEG-4 codec
CV_FOURCC(‘U’, ‘2’, ‘6’, ‘3’) = H263 codec
CV_FOURCC(‘I’, ‘2’, ‘6’, ‘3’) = H263I codec
CV_FOURCC(‘F’, ‘L’, ‘V’, ‘1’) = FLV1 codec
。第三个参数:创建的视频流的帧率
。第四个参数:每帧视频的大小
。第五个参数:如果它不为零,则编码器将编码彩色帧,否则为灰度帧(仅Windows当前支持该标志)

Tips:

—》若fourcc=-1,则会从系统中弹出编解码器选择对话框
—》若要保存图像序列,则应使用适当的文件名(例如img_%02d.jpg)和fourcc=0 或 fps=0。若要保存原始帧,应使用未压缩的图像格式(例如img_%02d.BMP)。
—》大多数编解码器是有损的。如果想要无损视频文件,则需要使用无损编解码器(例如FFMPEG FFV1,Huffman HFYU,Lagarith LAGS等)。
—》如果启用了FFMPEG,则可以使用codec=0; fps=0;来创建未压缩(原始)的视频文件。
—》生成文件占用空间最小的编码方式是MPEG-4.2 codec。在VideoWriter类的构造函数参数为CV_FOURCC(‘M’, ‘P’, ‘4’, ‘2’) 。最大的是MPEG-1 codec,对应在VideoWriter类的构造函数参数为CV_FOURCC(‘P’,‘I’,‘M’,‘1’) ,所占磁盘空间是前者的5.7倍。

2、代码:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>
#include <QDebug>

#include "opencv2/opencv.hpp"

using namespace cv;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    QImage mat2QImage(cv::Mat cvImg);

private slots:
    void readFrame();

private:
    Ui::MainWindow *ui;

    QTimer *time;

    Mat frame;

    VideoCapture cap;
    VideoWriter write;

    int counter;  //记录帧数
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    time = new QTimer(this);
    time->start(10);

    connect(time, SIGNAL(timeout()), this, SLOT(readFrame()));

    counter = 0;

    cap.open(0);
    write.open("test.avi", VideoWriter::fourcc('M', 'P', '4', '2'), 30.0, Size(640, 480), true); //保存在当前目录,名为test的AVI视频
}

MainWindow::~MainWindow()
{
    delete ui;
}

//读取摄像头视频并保存
void MainWindow::readFrame()
{
   cap >> frame;
   counter++;
   if(frame.empty())
   {
        qDebug()<<"frame is empty";
        cap.release();
   }

   if (counter <= 100)  //只保存100帧
   {
       qDebug() << "counter = " << counter;
       write.write(frame);  //保存视频帧
   }
   ui->label->setPixmap(QPixmap::fromImage(mat2QImage(frame)));
}

//Mat to QImage
QImage MainWindow::mat2QImage(cv::Mat cvImg)
{
    QImage qImg;

    if (cvImg.channels() == 3)                             //3 channels color image
    {
        cv::cvtColor(cvImg, cvImg, CV_BGR2RGB);
        qImg = QImage((const unsigned char*)(cvImg.data),
                      cvImg.cols, cvImg.rows,
                      cvImg.cols*cvImg.channels(),
                      QImage::Format_RGB888);
    }

    else if (cvImg.channels() == 1)                    //grayscale image
    {
        qImg = QImage((const unsigned char*)(cvImg.data),
                      cvImg.cols, cvImg.rows,
                      cvImg.cols*cvImg.channels(),
                      QImage::Format_Indexed8);
    }

    else
    {
        qImg = QImage((const unsigned char*)(cvImg.data),
                      cvImg.cols, cvImg.rows,
                      cvImg.cols*cvImg.channels(),
                      QImage::Format_RGB888);
    }
    return qImg;
}

main.c

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想在Qt读取地方摄像头视频,可以使用OpenCV的`VideoCapture`类进行操作。 具体步骤如下: 1. 在Qt中添加OpenCV库,可以在.pro文件中添加以下内容: ``` INCLUDEPATH += /usr/local/include/opencv4 LIBS += -L/usr/local/lib -lopencv_core -lopencv_highgui -lopencv_videoio ``` 其中,`/usr/local/include/opencv4`为OpenCV的头文件路径,`/usr/local/lib`为OpenCV库文件路径。 2. 在Qt中创建一个窗口用于显示视频。 3. 使用`VideoCapture`类打开地方摄像头,可以通过参数指定摄像头的设备编号或者视频文件的路径。 4. 循环读取视频帧并在窗口中显示,直到读取失败或者用户退出程序。 完整代码示例如下: ``` #include <opencv2/opencv.hpp> #include <QApplication> #include <QMainWindow> #include <QImage> #include <QPixmap> #include <QLabel> int main(int argc, char *argv[]) { QApplication app(argc, argv); QMainWindow window; QLabel label; window.setCentralWidget(&label); window.show(); cv::VideoCapture cap(0); // 打开地方摄像头 if (!cap.isOpened()) // 打开失败 { std::cerr << "Failed to open camera." << std::endl; return -1; } while (true) // 循环读取视频帧 { cv::Mat frame; cap >> frame; // 读取视频帧 if (frame.empty()) break; // 读取失败,退出循环 cv::cvtColor(frame, frame, cv::COLOR_BGR2RGB); // OpenCV图像格式为BGR,需要转换为RGB QImage qimg(frame.data, frame.cols, frame.rows, QImage::Format_RGB888); // 创建QImage对象 QPixmap qpixmap = QPixmap::fromImage(qimg); // 转换为QPixmap对象 label.setPixmap(qpixmap); // 显示在窗口中 QApplication::processEvents(); // 处理Qt事件,保证窗口正常显示 if (cv::waitKey(30) == 'q') break; // 按下q键退出循环 } return app.exec(); } ``` 其中,`QMainWindow`和`QLabel`用于创建窗口和显示视频帧,`QImage`和`QPixmap`用于将OpenCV的图像格式转换为Qt的图像格式,`QApplication::processEvents()`用于保证窗口正常显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值