RK3568 opencv播放視頻

文章目錄

  • 一、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' 退出,延遲 30msif (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 顏色格式,轉換為 RGBcv::cvtColor(frame, frame, cv::COLOR_BGR2RGB);// 將 Mat 轉換為 QImageQImage 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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void updateFrame();  // 更新視頻幀void togglePlayback();  // 切換播放/暫停狀態private:Ui::Widget *ui;QLabel *label;  // 用于顯示視頻的QLabelQPushButton *btnPlayPause;  // 播放/暫停按鈕cv::VideoCapture cap;  // OpenCV視頻捕獲對象QTimer *timer;  // 用于定時刷新視頻幀bool isPlaying;  // 播放狀態標記
};#endif // WIDGET_H

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67467.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67467.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67467.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pytorch邏輯回歸實現垃圾郵件檢測

完整代碼&#xff1a; import torch import torch.nn as nn import torch.optim as optim from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score import numpy as…

【 CVE-2025-21298】 通過ghidriff查看完整補丁差異

ole32_dec24.dll-ole32.dll 差異 目錄 視覺圖表差異元數據 Ghidra 差異引擎 命令行二進制元數據差異程序選項

洛谷P3383 【模板】線性篩素數

題目鏈接&#xff1a;P3383 【模板】線性篩素數 - 洛谷 | 計算機科學教育新生態 題目難度&#xff1a;普及一 題目分析&#xff1a;本題是模板題&#xff0c;用到了線性篩法&#xff0c;其中原理是保證范圍內的每個合數都被刪掉&#xff08;在 bool 數組里面標記為非素數…

STM32標準庫移植RT-Thread nano

STM32標準庫移植RT-Thread Nano 嗶哩嗶哩教程鏈接&#xff1a;STM32F1標準庫移植RT_Thread Nano 移植前的準備 stm32標準庫的裸機代碼&#xff08;最好帶有點燈和串口&#xff09;RT-Thread Nano Pack自己的開發板 移植前的說明 本人是在讀學生&#xff0c;正在學習階段&a…

JVM--類加載器

概念 類加載器&#xff1a;只參與加載過程中的字節碼獲取并加載到內存中的部分&#xff1b;java虛擬機提供給應用程序去實現獲取類和接口字節碼數據的一種技術&#xff0c;也就是說java虛擬機是允許程序員寫代碼去獲取字節碼信息 類加載是加載的第一步&#xff0c;主要有以下三…

ECMAScript 6語法

1.ES6簡介 ECMAScript 6&#xff08;簡稱ES6&#xff09;是于2015年6月正式發布的JavaScript語言的標準&#xff0c;正式名為ECMAScript 2015&#xff08;ES2015&#xff09;。它的目標是使得JavaScript語言可以用來編寫復雜的大型應用程序&#xff0c;成為企業級開發語言 。 …

聯想Y7000+RTX4060+i7+Ubuntu22.04運行DeepSeek開源多模態大模型Janus-Pro-1B+本地部署

直接上手搓了&#xff1a; conda create -n myenv python3.10 -ygit clone https://github.com/deepseek-ai/Janus.gitcd Januspip install -e .pip install webencodings beautifulsoup4 tinycss2pip install -e .[gradio]pip install pexpect>4.3python demo/app_januspr…

Tez 0.10.1安裝

個人博客地址&#xff1a;Tez 0.10.1安裝 | 一張假鈔的真實世界 具體安裝步驟參照官網安裝手冊即可。此處只對官網手冊進行補充。 從官網下載apache-tez-0.10.1-bin.tar.gz進行安裝未成功&#xff0c;出現下面的異常。最終按照官網源代碼編譯的方式安裝測試成功。 環境 Had…

FastAPI + GraphQL + SQLAlchemy 實現博客系統

本文將詳細介紹如何使用 FastAPI、GraphQL&#xff08;Strawberry&#xff09;和 SQLAlchemy 實現一個帶有認證功能的博客系統。 技術棧 FastAPI&#xff1a;高性能的 Python Web 框架Strawberry&#xff1a;Python GraphQL 庫SQLAlchemy&#xff1a;Python ORM 框架JWT&…

微服務入門(go)

微服務入門&#xff08;go&#xff09; 和單體服務對比&#xff1a;里面的服務僅僅用于某個特定的業務 一、領域驅動設計&#xff08;DDD&#xff09; 基本概念 領域和子域 領域&#xff1a;有范圍的界限&#xff08;邊界&#xff09; 子域&#xff1a;劃分的小范圍 核心域…

深入解析 Linux 內核內存管理核心:mm/memory.c

在 Linux 內核的眾多組件中,內存管理模塊是系統性能和穩定性的關鍵。mm/memory.c 文件作為內存管理的核心實現,承載著頁面故障處理、頁面表管理、內存區域映射與取消映射等重要功能。本文將深入探討 mm/memory.c 的設計思想、關鍵機制以及其在內核中的作用,幫助讀者更好地理…

安卓通過網絡獲取位置的方法

一 方法介紹 1. 基本權限設置 首先需要在 AndroidManifest.xml 中添加必要權限&#xff1a; xml <uses-permission android:name"android.permission.INTERNET" /> <uses-permission android:name"android.permission.ACCESS_NETWORK_STATE" /&g…

【B站保姆級視頻教程:Jetson配置YOLOv11環境(二)SSH連接的三種方式】

B站同步視頻教程&#xff1a;https://www.bilibili.com/video/BV1m5wUeyEQD/ 在Jetson設備上配置YOLOv11環境時&#xff0c;SSH連接是實現遠程高效開發與管理的關鍵一環。不同的網絡環境和硬件配置可能會影響SSH連接的方式&#xff0c;本文將結合相關視頻內容&#xff0c;詳細…

視頻拼接,拼接時長版本

目錄 視頻較長&#xff0c;分辨率較大&#xff0c;這個效果很好&#xff0c;不耗用內存 ffmpeg imageio&#xff0c;適合視頻較短 視頻較長&#xff0c;分辨率較大&#xff0c;這個效果很好&#xff0c;不耗用內存 ffmpeg import subprocess import glob import os from nats…

Vue.js 什么是 Composition API?

Vue.js 什么是 Composition API&#xff1f; 今天我們來聊聊 Vue 3 引入的一個重要特性&#xff1a;組合式 API&#xff08;Composition API&#xff09;。如果你曾在開發復雜的 Vue 組件時感到代碼難以維護&#xff0c;那么組合式 API 可能正是你需要的工具。 什么是組合式 …

Selenium配合Cookies實現網頁免登錄

文章目錄 前言1 方案一&#xff1a;使用Chrome用戶數據目錄2 方案二&#xff1a;手動獲取并保存Cookies&#xff0c;后續使用保存的Cookies3 注意事項 前言 在進行使用Selenium進行爬蟲、網頁自動化操作時&#xff0c;登錄往往是一個必須解決的問題&#xff0c;但是Selenium每次…

計算機畢業設計Python+知識圖譜大模型AI醫療問答系統 健康膳食推薦系統 食譜推薦系統 醫療大數據 機器學習 深度學習 人工智能 爬蟲 大數據畢業設計

溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 作者簡介&#xff1a;Java領…

關于el-table翻頁后序號列遞增的組件封裝

需求說明&#xff1a; 項目中經常會用到的一個場景&#xff0c;表格第一列顯示序號&#xff08;1、2、3...&#xff09;&#xff0c;但是在翻頁后要遞增顯示序號&#xff0c;例如10、11、12&#xff08;假設一頁顯示10條數據&#xff09;&#xff0c;針對這種情況&#xff0c;封…

Elasticsearch的索引生命周期管理

目錄 說明零、參考一、ILM的基本概念二、ILM的實踐步驟Elasticsearch ILM策略中的“最小年齡”是如何計算的&#xff1f;如何監控和調整Elasticsearch ILM策略的性能&#xff1f; 1. **監控性能**使用/_cat/thread_pool API基本請求格式請求特定線程池的信息響應內容 2. **調整…

AI大模型開發原理篇-3:詞向量和詞嵌入

簡介 詞向量是用于表示單詞意義的向量&#xff0c; 并且還可以被認為是單詞的特征向量或表示。 將單詞映射到實向量的技術稱為詞嵌入。在實際應用中&#xff0c;詞向量和詞嵌入這兩個重要的NLP術語通常可以互換使用。它們都表示將詞匯表中的單詞映射到固定大小的連續向量空間中…