計算機視覺全系列實戰教程 (十五):使用opencv對視頻進行基本處理

視頻處理基本介紹

  • 1、基本概述
    • (1)opencv中視頻處理的兩個基礎類
    • (2)視頻的屬性:獲取屬性和設置屬性
  • 2、VideoCapture的介紹
    • (1)Why( VideoCapture類的作用)
    • (2)How( 如何使用VideoCapture)
      • A.播放視頻文件函數
      • B.播放視頻文件并實現暫停和繼續
  • 3、VideoWriter類的介紹
    • (1)Why(VideoWriter類的作用)
    • (2)How(如何使用VideoWriter保存視頻)
  • 4、總結

1、基本概述

(1)opencv中視頻處理的兩個基礎類

初學者使用opencv對視頻進行處理時,應該首先關注兩個類:VideoCapture類和VideoWriter類

  • VideoCapture類:用于視頻的讀操作
  • VideoWriter類:用于視頻的寫操作

(2)視頻的屬性:獲取屬性和設置屬性

  • 視頻文件的當前播放位置:以毫秒為單位 -----------------------屬性id:propId = 0
  • 幀索引:視頻序列中幀的索引(以0為起始索引)-------------屬性id:propId = 1
  • 幀寬度/高度:像素為單位--------------------------------------------屬性id:propId = 3 / 4
  • 幀率:每一秒的所放映的幀數 --------------------------------------屬性id:propId = 5
  • 幀數:視頻文件的幀數(總數)------------------------------------屬性id:propId = 7
  • 圖像的亮度:僅適用于相機------------------------------------------屬性id:propId = 10
  • 圖像的對比度:僅適用于相機---------------------------------------屬性id:propId = 11
  • 圖像的飽和度:僅適用于相機---------------------------------------屬性id:propId = 12
  • 圖像的色調:僅適用于相機------------------------------------------屬性id:propId = 13
  • 圖像的增益:僅適用于相機------------------------------------------屬性id:propId = 14
  • 圖像的曝光:僅適用于相機------------------------------------------屬性id:propId = 15

A.獲取視頻的屬性:

double dRes = vidObj.get(propId);

B.設置視頻的屬性:

int propId = 4;
double dValue =100;
vidObj.set(propId, dValue);

2、VideoCapture的介紹

(1)Why( VideoCapture類的作用)

獲取視頻文件或攝像頭視頻

(2)How( 如何使用VideoCapture)

A.播放視頻文件函數

視頻播放函數如下(可直接使用):

/*@author @還下著雨ZG
* @brief 播放指定的視頻文件
* @param[in] strVideo, 視頻文件所在路徑
* @return int, 正表示播放成功,負數表示播放視頻文件失敗
*/
int VideoPlay(const std::string& strVideo)
{//創建VideoCapture對象cv::VideoCapture capture;//打開視頻文件capture.open(strVideo);//判斷是否打開成功if (!capture.isOpened()){std::cerr << "Failed to open video!" << std::endl;return -1;} //獲取視頻的幀率FPSdouble rate = capture.get(cv::CAP_PROP_FPS);//播放視頻cv::Mat frame;while (1){capture >> frame;if (frame.empty()){std::cout<<"播放完畢!"<<std::endl;break;}cv::imshow("Playing video...", frame);cv::waitKey(rate);}
}

B.播放視頻文件并實現暫停和繼續

視頻播放和暫停函數如下(可直接使用):

/*@author @還下著雨ZG
* @brief 播放指定的視頻文件并實現了暫停和繼續
* @param[in] strVideo, 視頻文件所在路徑
* @return int, 正表示播放成功,負數表示播放視頻文件失敗
*/
int VideoPlayAndStop(const std::string& strVideo)
{//讀取視頻文件cv::VideoCapture capture(strVideo, cv::CAP_ANY);if (!capture.isOpened()){std::cerr << "Failed to open video file!" << std::endl;return -1;}//顯示每一幀(視頻自帶幀率)cv::Mat imFrame;double dRate = capture.get(cv::CAP_PROP_FPS);int iDelay = 1000 / dRate;bool bStop = false;while (!bStop){capture >> imFrame;if (imFrame.empty()) {bStop = true;return 0;}else{imshow("MyFrame", imFrame);}int iKeyInput = cv::waitKey(iDelay);if (char(iKeyInput) == 27 ){bStop = true;}if (iKeyInput >= 0){cv::waitKey(0);}}capture.release();return 1;
}

3、VideoWriter類的介紹

(1)Why(VideoWriter類的作用)

保存修改后的視頻文件、保存攝像頭獲取的視頻序列、對待保存的視頻格式進行設置等

(2)How(如何使用VideoWriter保存視頻)

視頻保存,該函數一般是用于對視頻文件編輯之后的視頻進行保存,或保存攝像頭獲取的視頻序列(可根據實際需求做少量更改后使用):

int VideoSave(const std::string& strVideoSrc, const std::string& strVideoDst)
{//獲取視頻cv::VideoCapture capture;capture.open(strVideoSrc, cv::CAP_ANY);if (!capture.isOpened()){std::cerr << "Failed to open video file!" << std::endl;return -1;}//創建視頻錄制對象cv::VideoWriter writer;int iFourcc = writer.fourcc('M','J','P','G'); //視頻編碼格式double dFps = 25.0;cv::Mat imFrame;capture >> imFrame;if(imFrame.empty()) return -2;cv::Size SzFrame = imFrame.size();bool bIsColor = true; //彩色視頻(false表示灰色視頻)writer.open(strVideoDst,iFourcc, dFps, SzFrame, bIsColor);writer.write(imFrame);//將第一幀寫入到writer對象中int iRate = 1000/capture.get(cv::CAP_PROP_FPS); //獲取原始視頻的幀率//遍歷每一幀圖像while(1){if(!capture.read(imFrame)) break;writer.write(imFrame);cv::imshow("Frame", imFrame);if(cv::waitKey(iRate)>=0) break;}writer.release();capture.release();return 1;
}

注意:如果是需要保存攝像頭的視頻序列,應將該函數的第一個參數轉換為攝像頭的索引(0,1, …),函數內部做一定的修改即可

4、總結

  • VideoCapture類的基本介紹:該類的作用、視頻屬性、對視頻每一幀進行處理、視頻播放和暫停等
  • VideoWriter類的基本介紹:該類的作用、保存處理后的視頻序列、保存相機獲取的視頻序列等

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

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

相關文章

CJSON庫

目錄 一、介紹 1、JSON是什么 2、為什么使用CJSON 3、JSON格式 二、使用CJSON構造JSON 1、創建對象 2、添加字段 3、轉換格式 4、釋放對象 三、使用CJSON解析JSON 1、解析數據 2、 獲取字段 3、釋放對象 一、介紹 1、JSON是什么 JSON是什么呢&#xff1f;JSON全稱…

折半查找詳解

一&#xff1a;折半查找概念 折半查找&#xff08;也稱為二分查找&#xff09;是一種在有序數組中查找某一特定元素的搜索算法。搜索過程從數組的中間元素開始&#xff0c;如果中間元素正好是目標值&#xff0c;則搜索過程結束&#xff1b;如果目標值大于或小于中間元素&#x…

OceanBase 4.2.1 離線安裝

OceanBase 4.2.1 離線安裝 4.2 版本的OceanBase支持一鍵安裝&#xff0c;所以在線版本的安裝簡單了很多&#xff0c;但在無法連接網絡的情況下安裝就只能手動離線安裝。 注&#xff1a;如下安裝過程都是在同一臺機器上面進行&#xff0c;也就是只有一個節點&#xff0c;多個節…

SSM網上旅游信息管理系統-計算機畢業設計源碼06975

目 錄 摘要 1 緒論 1.1 研究背景 1.2 研究意義 1.3論文結構與章節安排 2 系統分析 2.1 可行性分析 2.2 系統流程分析 2.2.1 數據新增流程 2.2.2 數據刪除流程 2.3 系統功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系統用例分析 2.5本章小結 3 系統總體設…

Oracle、MySQL、PostGreSQL、SQL Server-查詢每秒事務數

Oracle、MySQL、PostGreSQL、SQL Server-查詢每秒事務數 在做 db benchmarks 時&#xff0c;qps、tps 是衡量數據庫性能的關鍵指標,TPS : Transactions Per Second 是每秒事務數&#xff0c;即數據庫服務器在單位時間內處理的事務數。 橫向對比計劃幾類數據庫計算tps的方法。 …

微信小程序畢業設計-垃圾分類系統項目開發實戰(附源碼+論文)

大家好&#xff01;我是程序猿老A&#xff0c;感謝您閱讀本文&#xff0c;歡迎一鍵三連哦。 &#x1f49e;當前專欄&#xff1a;微信小程序畢業設計 精彩專欄推薦&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python畢業設計…

AI產品哲學深探:從Perplexity CEO視角看搜索引擎的智慧啟示

一、開篇:歷史的分岔路口 在科技史的長河中,有些對話悄然決定了行業的走向。回溯至互聯網搜索的黎明時期,一場未被充分重視的會談在兩位科技巨擘之間展開。谷歌聯合創始人Larry Page與昔日搜索引擎巨頭Excite的CEO坐在了談判桌兩端,他們的對話不僅關乎一次潛在的并購,更預…

elasticsearch的查詢原理

數據結構 在 Elasticsearch 中,數據結構分布如下: 索引(Index) 索引是 Elasticsearch 中存儲數據的基本單元,相當于關系型數據庫中的數據庫。一個 Elasticsearch 集群中可以包含多個索引。 類型(Type) (從 Elasticsearch 7.0 開始已經被棄用): 在較早版本的 Elasticsearch…

Mathematica訓練課(46)-- 一些常用的畫圖函數

在前面的課程中&#xff0c;我們已經梳理了Plot的畫圖用法&#xff0c;今天就詳細梳理一下其他的畫圖函數用法&#xff1b; 1. 畫一條直線 2. Circle(圓) 3. Disk&#xff08;圓盤&#xff09; 4. 畫出一個矩形 5. 箭頭

c-前綴平方和序列(牛客小白月賽97)

題目&#xff1a; 假如一個長度為 n的正整數序列滿足所有前綴和 都是平方數&#xff0c;那么稱這種序列為前綴平方序列。 條件1<si<x 取模1e97 首先找出小于x的平方數有幾個。 然后用二項式定理 算出小于x的平方數中取n個的種數。 #include<bits/stdc.h> using…

大數據可視化實驗(六)——ECharts與pyecharts數據可視化

目錄 一、實驗目的... 1 二、實驗環境... 1 三、實驗內容... 1 1、ECharts可視化制作.. 1 1&#xff09;使用ECharts繪制折線圖顯示一周的天氣變換。... 1 2&#xff09;使用ECharts繪制柱狀圖顯示商品銷量的變化。... 4 2、pyecharts可視化制作.. 7 1&#xff09;使用…

beautifulSoup庫

是什么? Beautiful Soup(簡稱BS4)是一種強大而靈活的HTML和XML解析庫,廣泛用于Python爬蟲和數據采集中。相比正則表達式更加簡潔. Beautiful Soup提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。它是一個工具箱,通過解析文檔為用戶提供需要抓取的…

【知識學習】Unity3D中Shader Graph的概念及使用方法示例

Unity3D中的Shader Graph是一個強大的可視化Shader編輯工具&#xff0c;它允許用戶通過拖拽和連接節點的方式來創建Shader&#xff0c;而不是通過傳統的編寫代碼的方式。Shader Graph使得Shader的創建過程更加直觀和易于理解&#xff0c;特別是對于那些不熟悉Shader語言編程的美…

Java中的性能調優技巧與工具推薦

Java中的性能調優技巧與工具推薦 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們來探討Java中的性能調優技巧與工具推薦。Java作為一門廣泛應用的編程語…

【OpenREALM學習筆記:13】pose_estimation.cpp和pose_estimation.h

UML Class Diagram 圖中紅色框為頭文件中所涉及到的函數、變量和結構體 核心函數 PoseEstimation::process() 其核心作用為執行位姿估計的處理流程&#xff0c;并返回是否在此循環中進行了任何處理。 在這個函數中判斷并完成地理坐標的初始化或這地理坐標的更新。 這里需要…

QTreeView第一列自適應

通過setStretchLastSection(bool stretch)可以設置最后一列自適應,對于QTreeView,stretch默認為true。但有時候我們需要設置第一列自適應,比如文件瀏覽器,共有名稱、大小和修改日期三列,大小和日期的寬度幾乎是固定的,但名稱卻可長可短,此時我們希望在窗口大小變化時,第…

IDEA中Maven配置依賴和排除依賴

目錄 依賴配置 添加依賴的幾種方式&#xff1a; 1.利用中央倉庫搜索的依賴坐標 2.利用IDEA工具搜索依賴 3.熟練上手maven后&#xff0c;快速導入依賴 排除依賴 依賴配置 依賴&#xff1a;指當前項目運行所需要的jar包。一個項目中可以引入多個依賴&#xff1a; 例如&am…

python r”, b”, u”, f” 前綴詳解

1、r前綴 一般來說&#xff0c;\n’是一個換行符&#xff0c;是一個字符串&#xff1b;而加上r為前綴后&#xff0c;不會以任何特殊方式處理反斜杠。因此&#xff0c;r"\n" 是包含 ‘\’ 和 ‘n’ 的雙字符字符串&#xff1b;示例如下&#xff1a; >>> pr…

Go-知識測試-工作機制

Go-知識測試-工作機制 生成test的maintest的main如何啟動case單元測試 runTeststRunnertesting.T.Run 示例測試 runExamplesrunExampleprocessRunResult 性能測試 runBenchmarksrunNtesting.B.Run 在 Go 語言的源碼中&#xff0c;go test 命令的實現主要在 src/cmd/go/internal…

Java面試題:解釋反應式編程的概念,并討論如何在Java中使用RxJava或Project Reactor實現

反應式編程&#xff08;Reactive Programming&#xff09;是一種基于異步數據流和變化傳播的編程范式。它強調通過聲明式編程來處理異步事件流和數據流&#xff0c;簡化了復雜的異步操作和并發編程。反應式編程適用于處理異步事件、多線程處理、大量數據流、用戶交互等場景。 …