利用Qt+opencv实现视频分解为图片

 更新时间:2023年12月28日 15:21:02   作者:N阶二进制  
这篇文章主要为大家详细介绍了如何利用Qt和opencv实现视频分解为图片,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

最近遇到一些售前提供的BUG,但是他们提供的是录像视频,因为处理显示速度比较快,因此很难找到出现问题的位置。需要反复播放,自己编写了一个视频分解成图片这样就可以一张图一张图的对比,方便查看。

开发环境

qt+openvc

sudo apt install libopencv-dev

源码说明

引用opencv动态库

.pro文件需要添加opencv的动态库

LIBS += -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs

Qt代码

将视频分解成每一帧,然后将每一帧保存位图片。

void MainWindow::slotClickBtn()
{ // 打开视频文件
    cv::VideoCapture video("/pan/录屏_选择区域_20231227104611.mp4");

    // 检查视频是否成功打开
    if (!video.isOpened()) {
        std::cerr << "无法打开视频文件" << std::endl;

    }

    // 读取视频的帧率和总帧数
    double fps = video.get(cv::CAP_PROP_FPS);
    int totalFrames = video.get(cv::CAP_PROP_FRAME_COUNT);

    // 逐帧读取视频并保存为图像文件
    for (int frameNumber = 0; frameNumber < totalFrames; ++frameNumber) {
        cv::Mat frame;
        video.read(frame);

        // 检查是否成功读取帧
        if (frame.empty()) {
            std::cerr << "无法读取视频帧" << std::endl;
            break;
        }

        // 生成图像文件名,例如 frame_0001.jpg
        std::string filename = "frame_" + std::to_string(frameNumber + 1) + ".jpg";

        // 保存帧为图像文件
        cv::imwrite(filename, frame);
    }

    // 关闭视频文件
    video.release();
    std::cout << "视频分解完成,共生成 " << totalFrames << " 张图像文件。" << std::endl;

}

源代码地址

https://gitcode.net/arv002/qt/-/tree/master/opencv/VideoDecomposition

扩展

VideoCapture 详解

cv::VideoCapture 是 OpenCV 中用于从视频文件、摄像头或图像序列中捕获帧的类。它提供了一种方便的方式来处理视频流和图像序列。

以下是一些关于 cv::VideoCapture 的主要方法和属性的详细说明:

构造函数

cv::VideoCapture(const cv::String& filename);
cv::VideoCapture(int index);

filename:视频文件的路径,可以是本地文件路径或网络 URL。

index:摄像头的索引。通常,0 表示默认摄像头,1 表示第二个摄像头,以此类推。

成员函数

bool open(const cv::String& filename);

打开视频文件。返回 true 表示成功打开,false 表示失败。

bool isOpened() const;

检查视频是否成功打开。返回 true 表示成功打开,false 表示失败。

void release();

释放资源。关闭视频文件或释放摄像头。

bool read(cv::OutputArray image);

从视频流中读取一帧。返回 true 表示成功读取,false 表示读取失败或到达视频末尾。

double get(int propId) const;

获取视频流的属性值,例如帧率、宽度、高度等。propId 是属性标识符,例如 cv::CAP_PROP_FPS 表示帧率。

bool set(int propId, double value);

设置视频流的属性值。propId 是属性标识符,value 是要设置的值。

示例用法

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    cv::VideoCapture cap("path/to/your/video.mp4");

    if (!cap.isOpened()) {
        std::cerr << "无法打开视频文件" << std::endl;
        return -1;
    }

    double fps = cap.get(cv::CAP_PROP_FPS);
    int width = cap.get(cv::CAP_PROP_FRAME_WIDTH);
    int height = cap.get(cv::CAP_PROP_FRAME_HEIGHT);

    std::cout << "帧率: " << fps << ",宽度: " << width << ",高度: " << height << std::endl;

    cv::Mat frame;
    while (cap.read(frame)) {
        // 处理每一帧
        cv::imshow("Frame", frame);
        cv::waitKey(30);  // 等待30毫秒
    }

    cap.release();
    cv::destroyAllWindows();

    return 0;
}

上述代码演示了如何打开视频文件、获取视频属性、逐帧读取视频并显示。请根据实际需求调整。

到此这篇关于利用Qt+opencv实现视频分解为图片的文章就介绍到这了,更多相关Qt opencv视频分解为图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实例真题讲解数据结构中单向环形链表

    C语言实例真题讲解数据结构中单向环形链表

    链表可以说是一种最为基础的数据结构了,而单向链表更是基础中的基础。链表是由一组元素以特定的顺序组合或链接在一起的,不同元素之间在逻辑上相邻,但是在物理上并不一定相邻。在维护一组数据集合时,就可以使用链表,这一点和数组很相似
    2022-04-04
  • C++操作MySQL的实现示例

    C++操作MySQL的实现示例

    这篇文章主要介绍了C++操作MySQL的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • C++调用libcurl开源库实现邮件的发送功能流程详解

    C++调用libcurl开源库实现邮件的发送功能流程详解

    libcurl是一个免费开源的网络传输库,支持ftp、ftps、tftp,http、https、telnet、ldap、pop3、smtp等多种协议,接下来让我们一起来了解吧
    2021-11-11
  • C语言开发实现通讯录管理系统

    C语言开发实现通讯录管理系统

    这篇文章主要为大家详细介绍了C语言开发实现通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Qt实现可以计算大数的简单计算器

    Qt实现可以计算大数的简单计算器

    计算器是我们生活中很常见的东西,它可以由多种语言多种方式来实现。本文主要介绍的是基于C++语言,由QT实现的可以计算大数的简单计算器,需要的可以参考一下
    2022-12-12
  • C++ 位图及位图的实现原理

    C++ 位图及位图的实现原理

    位图实际上就是一个数组,因为数组有随机访问的功能,比较方便查找,这个数组一般是整形,今天通过本文给大家分享c++位图的实现原理及实现代码,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • C语言软件spi虚拟总线中间层设计详解

    C语言软件spi虚拟总线中间层设计详解

    这篇文章主要为大家介绍了C语言软件spi虚拟总线中间层设计详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • C++容器适配与栈的实现及dequeque和优先级详解

    C++容器适配与栈的实现及dequeque和优先级详解

    这篇文章主要介绍了C++容器适配与栈的实现及dequeque和优先级,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • C语言数据结构线性表教程示例详解

    C语言数据结构线性表教程示例详解

    这篇文章主要为大家介绍了C语言数据结构线性表的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-02-02
  • c++支持coroutine的简单示例

    c++支持coroutine的简单示例

    这篇文章主要介绍了c++支持coroutine的简单示例,使用的是linux 平台做的,需要的朋友可以参考下
    2014-03-03

最新评论