RK3568 opencv播放视频

news2025/2/1 7:37:55

文章目录

  • 一、opencv相关视频播放类
    • 1. `cv::VideoCapture` 类
      • 主要构造方法:
      • 主要方法:
    • 2. 视频播放基本流程
      • 代码示例:
    • 3. 获取和设置视频属性
    • 4. 结合 FFmpeg 使用
    • 5. OpenCV 视频播放的局限性
    • 6. 结合 Qt 实现更高级的视频播放
    • 总结
  • 二、QT中的代码实现


一、opencv相关视频播放类

在 OpenCV 中,视频播放主要依赖 cv::VideoCapture 类来进行视频读取和播放,同时使用 cv::imshow 进行帧显示。下面是 cv::VideoCapture 相关的基本概念和用法解析。


1. cv::VideoCapture

cv::VideoCapture 用于从视频文件、摄像头或网络流中读取视频数据。它可以处理多种格式的视频文件,如 MP4、AVI、MKV 以及摄像头流数据。

主要构造方法:

cv::VideoCapture();                     // 空构造函数,需要后续调用 open()
cv::VideoCapture(const std::string& filename); // 通过文件路径打开视频
cv::VideoCapture(int deviceID);         // 通过设备 ID 打开摄像头

主要方法:

方法作用
bool open(const std::string& filename)打开视频文件
bool open(int deviceID)打开摄像头
bool isOpened() const检查是否成功打开
void release()释放资源
bool read(cv::Mat& frame)读取下一帧
bool grab()只抓取一帧数据
bool retrieve(cv::Mat& frame, int flag = 0)获取当前抓取的帧
double get(int propId)获取视频参数
bool set(int propId, double value)设置视频参数

2. 视频播放基本流程

一个基本的视频播放程序通常包含以下步骤:

  1. 打开视频文件或摄像头
  2. 逐帧读取并显示
  3. 监听键盘输入进行暂停、退出等操作
  4. 释放资源

代码示例:

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

int main() {
    cv::VideoCapture cap("video.mp4"); // 打开视频文件
    if (!cap.isOpened()) {
        std::cerr << "无法打开视频文件!" << std::endl;
        return -1;
    }

    cv::Mat frame;
    while (true) {
        cap >> frame;  // 读取一帧
        if (frame.empty()) break; // 读取完毕则退出

        cv::imshow("Video Playback", frame);

        // 按 'q' 退出,延迟 30ms
        if (cv::waitKey(30) == 'q') break;
    }

    cap.release();
    cv::destroyAllWindows();
    return 0;
}

3. 获取和设置视频属性

可以使用 get()set() 获取或修改视频参数:

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); // 获取高度

修改属性(仅部分参数可修改):

cap.set(cv::CAP_PROP_FRAME_WIDTH, 640);
cap.set(cv::CAP_PROP_FRAME_HEIGHT, 480);

4. 结合 FFmpeg 使用

OpenCV 默认使用系统自带的编解码器播放视频,可能不支持所有格式。可以让 OpenCV 依赖 FFmpeg 来解码:

  • Windows 用户可以下载 FFmpeg 并设置环境变量。
  • Linux/macOS 用户可以使用 apt install ffmpegbrew install ffmpeg 进行安装。

检查 OpenCV 是否支持 FFmpeg:

std::cout << "FFmpeg support: " << cv::getBuildInformation() << std::endl;

5. OpenCV 视频播放的局限性

  1. 性能问题cv::VideoCapture 读取和解码较慢,不如 FFmpeg 专用库快。
  2. 格式支持有限:依赖编译选项和系统解码器,部分格式可能不受支持。
  3. 音频播放问题:OpenCV 仅处理视频帧,不支持音频,需要额外结合 FFmpeg 处理。

6. 结合 Qt 实现更高级的视频播放

如果你在 C++/Qt 项目中使用 OpenCV,可以使用 QLabel 结合 QImage 进行视频播放:

#include <opencv2/opencv.hpp>
#include <QImage>
#include <QPixmap>
#include <QLabel>

void displayFrame(cv::Mat frame, QLabel* label) {
    cv::cvtColor(frame, frame, cv::COLOR_BGR2RGB);
    QImage img(frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGB888);
    label->setPixmap(QPixmap::fromImage(img));
}

总结

  1. cv::VideoCapture 是 OpenCV 进行视频播放的核心类,可以从文件、摄像头读取视频。
  2. 基本流程 是打开视频 -> 逐帧读取 -> cv::imshow() 显示 -> 监听 cv::waitKey() 控制播放。
  3. 可以获取/设置视频属性,如帧率、宽高等。
  4. 性能有限,如果对播放速度、格式兼容性有较高要求,建议结合 FFmpegQt 多媒体模块

二、QT中的代码实现

#include "widget.h"
#include "ui_widget.h"
#include <QImage>
#include <QPixmap>
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent),
    ui(new Ui::Widget),
    label(new QLabel(this)),
    btnPlayPause(new QPushButton("暂停", this)), // 按钮默认显示“暂停”
    cap("/mnt/app/1.mp4"), // 本地视频路径
    timer(new QTimer(this)),
    isPlaying(true)
{
    ui->setupUi(this);
    setFixedSize(700, 550); // 固定窗口大小

    // 设置 QLabel 位置和大小
    label->setGeometry(10, 10, 640, 480);

    // 设置播放/暂停按钮
    btnPlayPause->setGeometry(300, 500, 100, 40);
    connect(btnPlayPause, &QPushButton::clicked, this, &Widget::togglePlayback);

    // 检查视频文件是否打开成功
    if (!cap.isOpened()) {
        qWarning("无法打开视频文件!");
        return;
    }

    // 启动定时器,每 30ms 更新一帧(大约 33 FPS)
    connect(timer, &QTimer::timeout, this, &Widget::updateFrame);
    timer->start(30);
}

Widget::~Widget()
{
    cap.release(); // 释放 OpenCV 资源
    delete timer;
    delete ui;
}

void Widget::updateFrame()
{
    if (!isPlaying) return; // 如果暂停,则不更新帧

    cv::Mat frame;
    cap >> frame;  // 读取一帧

    if (frame.empty()) {
        qWarning("视频播放结束!");
        timer->stop();  // 停止定时器
        return;
    }

    // OpenCV 默认是 BGR 颜色格式,转换为 RGB
    cv::cvtColor(frame, frame, cv::COLOR_BGR2RGB);

    // 将 Mat 转换为 QImage
    QImage img(frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGB888);

    // 显示图像,并适配 QLabel 尺寸
    label->setPixmap(QPixmap::fromImage(img).scaled(label->size(), Qt::KeepAspectRatio));
}

void Widget::togglePlayback()
{
    isPlaying = !isPlaying;
    btnPlayPause->setText(isPlaying ? "暂停" : "播放"); // 更新按钮文本
}

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QTimer>
#include <opencv2/opencv.hpp>

QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void updateFrame();  // 更新视频帧
    void togglePlayback();  // 切换播放/暂停状态

private:
    Ui::Widget *ui;
    QLabel *label;  // 用于显示视频的QLabel
    QPushButton *btnPlayPause;  // 播放/暂停按钮
    cv::VideoCapture cap;  // OpenCV视频捕获对象
    QTimer *timer;  // 用于定时刷新视频帧
    bool isPlaying;  // 播放状态标记
};

#endif // WIDGET_H

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2289216.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零代码搭建个人博客—Zblog结合内网穿透发布公网

目录 一、准备工作二、Z-blog 网站搭建1. XAMPP 环境设置2. Z-blog 安装3. Z-blog 网页测试 三、内网穿透工具 Cpolar 的安装和配置1. Cpolar 安装2. Cpolar 云端设置3. Cpolar 本地设置 四、本地网页发布五、注意六、本次经历总结 大家好&#xff0c;我是学问小小谢。 最近心血…

宏_wps_宏修改word中所有excel表格的格式_设置字体对齐格式_删除空行等

需求&#xff1a; 将word中所有excel表格的格式进行统一化&#xff0c;修改其中的数字类型为“宋体&#xff0c; 五号&#xff0c;右对齐&#xff0c; 不加粗&#xff0c;不倾斜”&#xff0c;其中的中文为“宋体&#xff0c; 五号&#xff0c; 不加粗&#xff0c;不倾斜” 数…

xss靶场

xss-labs下载地址&#xff1a;GitHub - do0dl3/xss-labs: xss 跨站漏洞平台 xss常见触发标签&#xff1a;XSS跨站脚本攻击实例与防御策略-CSDN博客 level-1 首先查看网页的源代码发现get传参的name的值test插入了html里头&#xff0c;还回显了payload的长度。 <!DOCTYPE …

线段树(Segment Tree)和树状数组

线段树&#xff08;Segment Tree&#xff09;和树状数组 线段树的实现链式&#xff1a;数组实现 解题思路树状数组 线段树是 二叉树结构 的衍生&#xff0c;用于高效解决区间查询和动态修改的问题&#xff0c;其中区间查询的时间复杂度为 O(logN)&#xff0c;动态修改单个元素的…

MySQL注入中load_file()函数的使用

前言 在Msql注入中&#xff0c;load_file()函数在获得webshell以及提权过程中起着十分重要的作用&#xff0c;常被用来读取各种配置文件 而load_file函数只有在满足两个条件的情况下才可以使用&#xff1a; 文件权限&#xff1a;chmod ax pathtofile 文件大小&#xff1a;必须…

DeepSeek-R1 论文解读 —— 强化学习大语言模型新时代来临?

近年来&#xff0c;人工智能&#xff08;AI&#xff09;领域发展迅猛&#xff0c;大语言模型&#xff08;LLMs&#xff09;为通用人工智能&#xff08;AGI&#xff09;的发展开辟了道路。OpenAI 的 o1 模型表现非凡&#xff0c;它引入的创新性推理时缩放技术显著提升了推理能力…

使用Pygame制作“贪吃蛇”游戏

贪吃蛇 是一款经典的休闲小游戏&#xff1a;玩家通过操控一条会不断变长的“蛇”在屏幕中移动&#xff0c;去吃随机出现的食物&#xff0c;同时要避免撞到墙壁或自己身体的其他部分。由于其逻辑相对简单&#xff0c;但可玩性和扩展性都不错&#xff0c;非常适合作为新手练习游戏…

海外问卷调查如何影响企业的经营?在品牌建设中有何指导意义?

市场调查的定义&#xff1a;通过科学的方法&#xff0c;有目的地、系统地搜集整理一些市场信息&#xff0c;其目的在于了解当下市场现状和发展前景&#xff0c;为企业生产和品牌打造提供一些科学的指导意见&#xff0c;这是任何大企业、中小企业、初创企业都必须重视的一个重要…

unity学习23:场景scene相关,场景信息,场景跳转

目录 1 默认场景和Assets里的场景 1.1 scene的作用 1.2 scene作为project的入口 1.3 默认场景 2 场景scene相关 2.1 创建scene 2.2 切换场景 2.3 build中的场景&#xff0c;在构建中包含的场景 &#xff08;否则会认为是失效的Scene&#xff09; 2.4 Scenes in Bui…

CPU 100% 出现系统中断 怎么解决

CPU 100% 出现系统中断 怎么解决 电脑开机时会掉帧&#xff0c;切换到桌面时就会卡顿&#xff0c;然后打开任务管理器就会看到系统中断的cpu占用率达到100%&#xff0c;过一段时间再打开还是会有显示100%的占用率&#xff0c;这个问题怎么解决&#xff1f; 文章目录 CPU 100% …

数据分析系列--⑥RapidMiner构建决策树(泰坦尼克号案例含数据)

一、资源下载 二、数据处理 1.导入数据 2.数据预处理 三、构建模型 1.构建决策树 2.划分训练集和测试集 3.应用模型 4.结果分析 一、资源下载 点击下载数据集 二、数据处理 1.导入数据 2.数据预处理 三、构建模型 1.构建决策树 虽然决策树已经构建,但对于大多数初学者或…

【MyDB】4-VersionManager 之 4-VM的实现

【MyDB】4-VersionManager 之 4-VM的实现 VM 的实现VM(VersionManager)的基本定义与实现优化具体功能实现begin()开启事务commit()提交事务abort 中止事务read 读取uid对应的数据记录所在的entryinsert方法&#xff0c;插入数据delete方法 VM 的实现 本章代码位于&#xff1a;t…

计算机网络 笔记 传输层

概述&#xff1a; 主要功能&#xff1a; TCP&#xff1a; 特点***&#xff1a; 数据格式&#xff1a; 连接管理***&#xff1a; 建立连接&#xff08;三次握手&#xff09; 释放连接&#xff08;四次挥手&#xff09; 应用场景 UDP&#xff1a; 特点&#xff1a; 数…

(leetcode 213 打家劫舍ii)

代码随想录&#xff1a; 将一个线性数组换成两个线性数组&#xff08;去掉头&#xff0c;去掉尾&#xff09; 分别求两个线性数组的最大值 最后求这两个数组的最大值 代码随想录视频 #include<iostream> #include<vector> #include<algorithm> //nums:2,…

《TCP 网络编程实战:开发流程、缓冲区原理、三次握手与四次挥手》

一、 TCP 网络应用程序开发流程 学习目标 能够知道TCP客户端程序的开发流程1. TCP 网络应用程序开发流程的介绍 TCP 网络应用程序开发分为: TCP 客户端程序开发TCP 服务端程序开发说明: 客户端程序是指运行在用户设备上的程序 服务端程序是指运行在服务器设备上的程序,专门…

把本地搭建的hexo博客部署到自己的服务器上

配置远程服务器的git 安装git 安装依赖工具包 yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel安装编译工具 yum install -y gcc perl-ExtUtils-MakeMaker package下载git&#xff0c;也可以去官网下载了传到服务器上 wget https://www.ke…

接口使用实例(1)

大家好&#xff0c;今天我们来看看接口的一些实例&#xff0c;关于如何定义和实现接口&#xff0c;相信通过这些例子&#xff0c;我们能有一些清晰的认知。 先定义一个学生类&#xff1a; 再给定一个学生数组&#xff0c;对这个对象数组中的元素进行排序&#xff08;按分数排&…

Git 版本控制:基础介绍与常用操作

目录 Git 的基本概念 Git 安装与配置 Git 常用命令与操作 1. 初始化本地仓库 2. 版本控制工作流程 3. 分支管理 4. 解决冲突 5. 回退和撤销 6. 查看提交日志 前言 在软件开发过程中&#xff0c;开发者常常需要在现有程序的基础上进行修改和扩展。但如果不加以管理&am…

跨境数据传输问题常见解决方式

在全球化经济的浪潮下&#xff0c;跨境数据传输已然成为企业日常运营的关键环节。随着数字贸易的蓬勃发展和跨国业务的持续扩张&#xff0c;企业在跨境数据处理方面遭遇了诸多棘手难题。那么&#xff0c;面对这些常见问题&#xff0c;企业该如何应对&#xff1f;镭速跨境数据传…

python-leetcode-删除链表的倒数第 N 个结点

19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def removeNthFromEnd(self…