OpenCV 視頻處理與攝像頭操作詳解

1. 引言

大家都來寫OpenCV😊,學的好開心!


2. 視頻基礎與OpenCV簡介

2.1 視頻的定義

視頻(Video)是由一系列靜態圖像(幀)以一定速率連續播放形成的動態影像。其本質是利用人眼的視覺暫留效應,將靜止的畫面轉化為連續的動態內容。視頻通常包含畫面、音頻軌道,有時還包括字幕、特效等信息。

視頻的主要應用領域
  • 影視娛樂
  • 教育培訓
  • 安防監控
  • 通信與直播
  • 自動駕駛與智能交通

2.2 OpenCV簡介

OpenCV(Open Source Computer Vision Library)是一個跨平臺的計算機視覺和機器學習軟件庫,支持C++、Python等多種語言。它為視頻處理、圖像分析、機器學習等任務提供了高效的算法和接口。


3. 視頻讀寫

3.1 視頻的基本操作

圖片轉視頻

將多張圖片按順序和時間間隔組合,添加轉場、音樂、字幕等,生成視頻。例如旅游紀念視頻、照片合成動畫等。

視頻轉圖片

從視頻中提取特定幀作為圖片,用于精彩瞬間捕捉、視頻封面、畫面分析等。例如電影劇照、運動分析等。

3.2 OpenCV讀取視頻詳解

OpenCV通過cv::VideoCapture類實現視頻文件或攝像頭流的讀取。

代碼示例
#include?<opencv2/opencv.hpp>#include?<iostream>using?namespace?cv;using?namespace?std;int?main(){//1?指定視頻文件路徑創建VideoCapture?VideoCapture?cap("C:/Users/Administrator/Desktop/video/cat.mp4");//2?判斷是否成功打開視頻if?(!cap.isOpened()){cout?<<?"視頻打開失敗!"?<<?endl;return?-1;}//3?獲取視頻基本信息double?width?=?cap.get(CAP_PROP_FRAME_WIDTH);double?height?=?cap.get(CAP_PROP_FRAME_HEIGHT);double?count?=?cap.get(CAP_PROP_FRAME_COUNT);double?fps?=?cap.get(CAP_PROP_FPS);cout?<<?"視頻的寬="?<<?width?<<?endl;cout?<<?"視頻的高="?<<?height?<<?endl;cout?<<?"視頻的總幀數="?<<?count?<<?endl;cout?<<?"視頻的fps="?<<?fps?<<?endl;//4?逐幀讀取視頻并展示Mat?frame;width?=?width?*?0.2;height?=?height?*?0.2;while?(true){cap?>>?frame;if?(frame.empty()){break;}Mat?dst;resize(frame,?dst,?Size(width,height));Mat?gray;cvtColor(dst,?gray,?COLOR_BGR2GRAY);imshow("video",?dst);imshow("gray?video",?gray);if?(waitKey(1000/fps)?==?27){break;}}//5?釋放資源cap.release();destroyAllWindows();return?0;}
視頻屬性表
屬性名說明類型示例值
CAP_PROP_FRAME_WIDTH視頻幀寬度(像素)double1920
CAP_PROP_FRAME_HEIGHT視頻幀高度(像素)double1080
CAP_PROP_FPS視頻幀率(幀/秒)double30.0
CAP_PROP_FRAME_COUNT視頻總幀數double2500
CAP_PROP_POS_FRAMES當前幀索引(從0開始)double100
CAP_PROP_POS_MSEC當前時間戳(毫秒)double3500.0
CAP_PROP_FOURCC編解碼器FourCC代碼double1196444237
CAP_PROP_BRIGHTNESS攝像頭亮度(僅攝像頭有效)double0.5
CAP_PROP_CONTRAST攝像頭對比度double0.3
CAP_PROP_SATURATION攝像頭飽和度double0.8
CAP_PROP_EXPOSURE攝像頭曝光值double-4.0
CAP_PROP_AUTOFOCUS自動對焦是否開啟double1.0

3.3 視頻保存與編碼格式

OpenCV通過cv::VideoWriter類實現視頻錄制與保存。

FourCC編碼格式
  • 'MJPG':Motion-JPEG,常用于.avi文件
  • 'XVID':XVID編碼,適用于.avi文件
  • 'H264':H.264編碼,適用于.mp4文件(需安裝OpenH264庫)
視頻保存代碼示例
void?writeVideo(VideoCapture&?cap){cv::String?fileName?=?"C:/Users/Administrator/Desktop/video/temp.avi";int?fourcc?=?VideoWriter::fourcc('M',?'J',?'P',?'G');double?width?=?cap.get(CAP_PROP_FRAME_WIDTH);double?height?=?cap.get(CAP_PROP_FRAME_HEIGHT);double?fps?=?cap.get(CAP_PROP_FPS);VideoWriter?writer(fileName,fourcc,fps,Size(width,height),false);if?(!writer.isOpened()){cout?<<?"視頻文件打開失敗!"?<<?endl;return;}Mat?src;while?(true){cap?>>?src;if?(src.empty()){break;}Mat?gray;cvtColor(src,?gray,?COLOR_BGR2GRAY);writer.write(gray);if?(waitKey(30)?==?27){break;}}cout?<<?"已經成功保存視頻"?<<?endl;writer.release();}
視頻保存流程
  1. 創建VideoWriter對象,指定文件名、編碼格式、幀率、分辨率、是否彩色
  2. 判斷文件是否成功打開
  3. 逐幀寫入視頻
  4. 釋放資源

4. 視頻追蹤

4.1 視頻追蹤定義與應用

視頻追蹤(Video Tracking)是指在連續的視頻幀中定位并跟蹤特定目標(如人臉、車輛)的運動軌跡。廣泛應用于:

  • 安防監控
  • 自動駕駛
  • 人機交互
  • 運動分析
視頻追蹤流程
  1. 目標檢測:識別并定位目標
  2. 特征提取:提取目標特征(顏色、形狀、紋理等)
  3. 模型更新:適應目標外觀變化
  4. 位置預測與校正:預測目標位置并校正

4.2 Meanshift算法原理與實現

Meanshift算法定義

Meanshift是一種基于密度估計的非參數化聚類算法,廣泛用于目標追蹤。其核心思想是通過迭代將搜索窗口向目標區域的顏色直方圖分布中心移動,實現目標定位。

直方圖反向投影

直方圖反向投影是指將目標區域的顏色分布映射到整幅圖像,得到每個像素屬于目標的概率圖。

反向投影流程
  1. 選定目標區域,計算HSV直方圖
  2. 對每一幀計算直方圖
  3. 對比直方圖,得到相似度
  4. 生成概率圖,作為Meanshift輸入
Meanshift代碼解析
void?meanshiftTest(VideoCapture&?cap){Mat?frame;cap?>>?frame;if?(frame.empty()){cout?<<?"無法讀取視頻幀"?<<?endl;return;}Rect?roi?=?selectROI("請選擇追蹤目標",frame,false);if?(roi.width?<=?0?||?roi.height?<=?0){cout?<<?"已取消選擇roi區域"?<<?endl;return;}Mat?target?=?frame(roi).clone();imshow("target",?target);Mat?hsv_target;cvtColor(target,?hsv_target,?COLOR_BGR2HSV);Mat?mask;inRange(hsv_target,?Scalar(0,?30,?0),?Scalar(180,?255,?255),?mask);int?histSize?=?180;float?range[]?=?{?0,180?};const?float*?histRange?=?{?range?};Mat?hist_target;int?channels[]?=?{?0?};calcHist(&hsv_target,?1,?channels,?mask,?hist_target,?1,?&histSize,?&histRange);normalize(hist_target,?hist_target,?0,255,?NORM_MINMAX);TermCriteria?criteria(TermCriteria::EPS?|?TermCriteria::COUNT,?10,?1);while?(true){cap?>>?frame;if?(frame.empty()){break;}Mat?hsvFrame;cvtColor(frame,?hsvFrame,?COLOR_BGR2HSV);Mat?back;calcBackProject(&hsvFrame,?1,?channels,?hist_target,?back,&histRange);meanShift(back,?roi,?criteria);rectangle(frame,?roi,?Scalar(0,?255,?0));imshow("視頻追蹤",?frame);if?(waitKey(30)?==?27){break;}}}
關鍵函數說明
  • selectROI:手動選擇目標區域
  • calcHist:計算目標區域顏色直方圖
  • normalize:歸一化直方圖
  • calcBackProject:計算反向投影概率圖
  • meanShift:執行Meanshift迭代,更新目標位置
TermCriteria參數說明
參數類型說明
TermCriteria::EPS收斂到指定精度時終止
TermCriteria::COUNT達到最大迭代次數時終止
10最大迭代次數
1精度閾值(像素)

4.3 Camshift算法原理與實現

Camshift算法定義

Camshift(Continuously Adaptive Mean Shift)是Meanshift的改進版,能自適應調整搜索窗口的大小和方向,適合目標尺度和方向變化明顯的場景。

Camshift實現流程
  1. 初始化目標模型,計算顏色直方圖
  2. 定義搜索窗口
  3. 執行Meanshift迭代
  4. 根據目標分布調整窗口大小和方向
  5. 更新窗口位置,輸出最佳擬合橢圓
Camshift代碼解析
void?camshiftTest(VideoCapture&?cap){Mat?frame;cap?>>?frame;if?(frame.empty()){cout?<<?"無法讀取視頻幀"?<<?endl;return;}Rect?roi?=?selectROI("請選擇追蹤目標",?frame,?false);if?(roi.width?<=?0?||?roi.height?<=?0){cout?<<?"已取消選擇roi區域"?<<?endl;return;}Mat?target?=?frame(roi).clone();imshow("target",?target);Mat?hsv_target;cvtColor(target,?hsv_target,?COLOR_BGR2HSV);Mat?mask;inRange(hsv_target,?Scalar(0,?60,?32),?Scalar(180,?255,?255),?mask);int?histSize?=?180;float?range[]?=?{?0,180?};const?float*?histRange?=?{?range?};Mat?hist_target;int?channels[]?=?{?0?};calcHist(&hsv_target,?1,?channels,?mask,?hist_target,?1,?&histSize,?&histRange);normalize(hist_target,?hist_target,?0,?255,?NORM_MINMAX);TermCriteria?criteria(TermCriteria::EPS?|?TermCriteria::COUNT,?10,?1);while?(true){cap?>>?frame;if?(frame.empty()){break;}Mat?hsvFrame;cvtColor(frame,?hsvFrame,?COLOR_BGR2HSV);Mat?back;calcBackProject(&hsvFrame,?1,?channels,?hist_target,?back,?&histRange);RotatedRect?trackBox?=?CamShift(back,?roi,?criteria);rectangle(frame,?roi,?Scalar(0,?255,?0));//ellipse(frame,?trackBox,?Scalar(0,?0,?255),?2);imshow("視頻追蹤",?frame);if?(waitKey(30)?==?27){break;}}}
Camshift返回值說明
  • RotatedRect:最佳擬合橢圓,包含中心位置、大小、旋轉角度

4.4 Meanshift與Camshift對比分析

算法窗口大小適應目標變化適用場景實時性輸出信息
Meanshift固定不適應目標大小不變極高位置
Camshift自適應適應目標尺度/方向變化較高位置+大小+方向
選擇建議
  • 優先Meanshift:目標大小和方向基本不變,對實時性要求極高
  • 優先Camshift:目標尺度或方向變化明顯,需要輸出目標朝向信息

5. 攝像頭實時處理

5.1 實時處理定義與應用

攝像頭實時處理是指通過攝像頭捕獲視頻流,對每一幀圖像進行即時處理和分析,并實時顯示或反饋結果。應用包括:

  • 實時人臉檢測
  • 運動物體追蹤
  • 增強現實(AR)效果

5.2 攝像頭實時捕獲與處理流程

  1. 打開攝像頭(cv::VideoCapture
  2. 逐幀讀取視頻流
  3. 對每一幀進行處理(如灰度化、邊緣檢測等)
  4. 實時顯示處理結果(cv::imshow
  5. 釋放資源
攝像頭實時處理代碼解析
void?cameraTest(){VideoCapture?cap(0);cap.set(CAP_PROP_FRAME_WIDTH,680);cap.set(CAP_PROP_FRAME_HEIGHT,?480);Mat?frame;while?(true){cap?>>?frame;if?(frame.empty()){cout?<<?"無法讀取攝像頭幀"?<<?endl;break;}Mat?gray;cvtColor(frame,?gray,?COLOR_BGR2GRAY);imshow("實時幀",?frame);imshow("灰度幀",?gray);if?(waitKey(30)?==?27){break;}}cap.release();destroyAllWindows();}

5.3 實時視頻處理應用舉例

5.3.1 實時跟蹤

利用Meanshift或Camshift算法對攝像頭捕獲內容進行實時目標跟蹤。

void?camShiftCameraTest(){VideoCapture?cap(0);Mat?frame;cap?>>?frame;if?(frame.empty()){cout?<<?"無法讀取視頻幀"?<<?endl;return;}Rect?roi?=?selectROI("請選擇追蹤目標",?frame,?false);if?(roi.width?<=?0?||?roi.height?<=?0){cout?<<?"已取消選擇roi區域"?<<?endl;return;}Mat?target?=?frame(roi).clone();imshow("target",?target);Mat?hsv_target;cvtColor(target,?hsv_target,?COLOR_BGR2HSV);Mat?mask;inRange(hsv_target,?Scalar(0,?60,?32),?Scalar(180,?255,?255),?mask);int?histSize?=?180;float?range[]?=?{?0,180?};const?float*?histRange?=?{?range?};Mat?hist_target;int?channels[]?=?{?0?};calcHist(&hsv_target,?1,?channels,?mask,?hist_target,?1,?&histSize,?&histRange);normalize(hist_target,?hist_target,?0,?255,?NORM_MINMAX);TermCriteria?criteria(TermCriteria::EPS?|?TermCriteria::COUNT,?10,?1);while?(true){cap?>>?frame;if?(frame.empty()){break;}Mat?hsvFrame;cvtColor(frame,?hsvFrame,?COLOR_BGR2HSV);Mat?back;calcBackProject(&hsvFrame,?1,?channels,?hist_target,?back,?&histRange);RotatedRect?trackBox?=?CamShift(back,?roi,?criteria);rectangle(frame,?roi,?Scalar(0,?255,?0));//ellipse(frame,?trackBox,?Scalar(0,?0,?255),?2);imshow("視頻追蹤",?frame);if?(waitKey(30)?==?27){break;}}destroyAllWindows();}
5.3.2 實時邊緣檢測

通過攝像頭實時捕獲視頻,使用Canny算法提取圖像邊緣。
?????

void?cameraCannyTest(){VideoCapture?cap(0);cap.set(CAP_PROP_FRAME_WIDTH,?680);cap.set(CAP_PROP_FRAME_HEIGHT,?480);Mat?frame;while?(true){cap?>>?frame;if?(frame.empty()){cout?<<?"無法讀取攝像頭幀"?<<?endl;break;}Mat?gray;cvtColor(frame,?gray,?COLOR_BGR2GRAY);Mat?blur;GaussianBlur(gray,?blur,?Size(3,?3),1.5);Mat?dst;Canny(blur,?dst,?50,?150);imshow("實時幀",?frame);imshow("邊緣檢測",?dst);if?(waitKey(30)?==?27){break;}}cap.release();destroyAllWindows();}
5.3.3 其他應用

攝像頭實時捕獲內容不僅能做跟蹤和邊緣檢測,還可用于:

  • 實時人臉識別
  • 實時手勢識別
  • 實時目標分割
  • 實時AR效果疊加

6. 總結與展望

好學,愛學,還得學!

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

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

相關文章

Agentic AI 的威脅與緩解措施

原文&#xff1a;https://www.aigl.blog/content/files/2025/04/Agentic-AI—Threats-and-Mitigations.pdf AI Agent 的定義 1. 定義與基礎 智能代理&#xff08;Agent&#xff09;的定義&#xff1a; 智能代理是一種能夠感知環境、進行推理、做出決策并自主采取行動以實現特定…

ArrayList列表解析

ArrayList集合 ArrayList 的底層是數組隊列&#xff0c;相當于動態數組。與 Java 中的數組相比&#xff0c;它的容量能動態增長。在添加大量元素前&#xff0c;應用程序可以使用ensureCapacity操作來增加 ArrayList 實例的容量。這可以減少遞增式再分配的數量。 ArrayList 繼承…

《戀與深空》中龍和蛇分別是誰的代表

在《戀與深空》宏大而神秘的世界觀中&#xff0c;每一個符號都蘊含著深意。當玩家們熱議“龍”和“蛇”這兩種強大而古老的生物究竟代表著誰時&#xff0c;所有的線索都默契地指向了同一個名字——秦徹。 他不僅是力量與權威的象征“惡龍”&#xff0c;也是背負著宿命與糾葛的“…

gitignore添加后如何生效?

清除 Git 緩存&#xff1a; git rm -r --cached .添加文件到 Git&#xff1a;git add .使用 git commit 命令提交這些更改git commit -m "Update .gitignore"

多尺度頻率輔助類 Mamba 線性注意力模塊(MFM),融合頻域和空域特征,提升多尺度、復雜場景下的目標檢測能力

在偽裝物體檢測領域&#xff0c;現有方法大多依賴空間局部特征&#xff0c;難以有效捕捉全局信息&#xff0c;而 Transformer 類方法雖能建模長距離依賴關系&#xff0c;卻存在計算成本高、網絡結構復雜的問題。同時&#xff0c;頻域特征雖具備全局建模能力&#xff0c;可頻繁的…

Dify的默認端口怎么修改

1.定位配置文件 在 Dify 的安裝目錄中找到 .env 文件&#xff08;通常位于 docker/ 子目錄下&#xff09;。此文件定義了 Docker 容器的環境變量&#xff0c;包括端口配置。 2.調整端口參數 修改以下兩個關鍵配置項&#xff1a; # Docker 容器內部 Nginx 監聽的端口&#xf…

Go內存分配

圖解Go語言內存分配 - 知乎 go內置運行時&#xff0c;采用了自主管理&#xff0c;實現更好的內存使用模式&#xff0c;不需要每次內存分配都進行系統調用 采用TCMalloc算法&#xff1a;把內存分為多級管理&#xff0c;從而降低鎖的粒度 將可用的堆內存采用二級分配的方式進行…

cursor使用mcp連接mysql數據庫,url方式

背景。 用cursor生成后端代碼。讓cursor可以創建響應的表結構以及插入數據。使用的cursor版本是1.2.1 cursor 官網 mcp 說明smithery 中mysql mcp這個mcp具有建表的本領。 在cursor中是這樣配置的。 以上這種配置方式是是通過在smithery 網站中配置好自己的mysql數據庫連接后才…

Twisted study notes[1]

文章目錄serverreferencesserver Twisted usually using subclass twisted.internet.protocol.Protocol to treat protocols .Protocol is a fundamental class in Twisted for implementing network protocols.protocol class instant don’t exists forever because of it w…

Python 數據建模與分析項目實戰預備 Day 6 - 多模型對比與交叉驗證驗證策略

? 今日目標 引入多種常見分類模型&#xff08;隨機森林、支持向量機、K近鄰等&#xff09;比較不同模型的訓練效果使用交叉驗證提升評估穩定性&#x1f9fe; 一、對比模型列表模型類名&#xff08;sklearn&#xff09;適用說明邏輯回歸LogisticRegression基礎線、易于解釋KNNK…

xss-labs 1-8關

level1打開檢查&#xff0c;發現test直接放入h2標簽中此時通過script繞過h2標簽構造payload127.0.0.1/xss-labs/lvel1.php?name<script>alert(111)</script>直接使用script標簽繞過h2,并執行alert,通過level2打開檢查&#xff0c;輸入的123被放在input標簽里面的v…

Conda 核心命令快速查閱表

本表旨在提供一個簡潔、高效的 Conda 命令參考&#xff0c;專注于最常用功能的快速查找。 1. 環境管理 (Environment Management)功能 (Function)命令 (Command)示例 (Example)創建新環境conda create -n <env_name> [packages...]conda create -n myenv python3.9 panda…

音視頻學習(三十九):IDR幀和I幀

主要區分&#xff1a;I 幀 是幀內編碼幀&#xff0c;IDR 幀 是一種特殊的 I 幀&#xff0c;它是“清除參考幀鏈的強制切斷點”。H.264 視頻結構 結構 H.264 視頻由多個 NAL&#xff08;Network Abstraction Layer&#xff09;單元 構成&#xff0c;每一幀圖像可由一個或多個 NA…

人工智能與機器學習暑期科研項目招募(可發表論文)

人工智能與機器學習暑期科研項目招募 華中科技大學博士論文指導我是計算機專業的研二學生&#xff1a;從大二開始接觸科研&#xff0c;至今已發表1篇CCF-A類會議論文、1篇CCF-B類會議論文&#xff0c;以及2篇Top期刊論文。正是這段從本科開始的科研經歷&#xff0c;讓我在保研和…

C盤爆滿?一鍵清理恢復極速體驗!“小番茄C盤清理”徹底解放你的電腦

目錄 前言 C盤變紅&#xff1f;&#xff01;那么你的電腦將會出現下面糟糕的情況&#xff1a; 一、小番茄C盤清理介紹——拯救你的C盤爆紅&#xff01; 二、安裝登錄小番茄C盤清理 2.1 安裝小番茄C盤清理 2.2 登錄—擁有專屬自己電腦的小番茄C盤清理 三、手把手教你深度…

UI前端大數據可視化實戰技巧:如何利用數據故事化提升用戶參與度?

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;從 “圖表堆砌” 到 “故事共鳴” 的可視化革命當企業管理者面對布滿折線…

CSS基礎1.1

HTML骨架<!DOCTYPE html> <!-- 中文網站 --> <html lang"zh-CN"> <head><!--charset"UTF-8" 規定網頁的字符編碼 --><meta charset"UTF-8"><!-- ie(兼容性差) / edge --><meta http-equiv"X…

前端基礎JavaScript 筆記

本文是基于 B 站 pink 老師前端 JavaScript 課程整理的學習筆記 JS簡介 JavaScript是一種運行在客戶端&#xff08;瀏覽器&#xff09;的編程語言 作用&#xff1a;1.網頁特效(監聽用戶的一些行為讓網頁作出對應的反饋) 2.表單驗證(針對表單數據的合法性進行判斷) 3.數據交互…

「小程序開發」項目結構和頁面組成

微信小程序目錄 微信小程序的目錄,每種文件都有特定用途,組合起來才能構建完整應用。 小程序最基本的目錄結構通常包含這些部分: my-miniprogram/ ├── pages/ // 存放所有頁面 │ ├── index/ // 存放index頁面的邏輯文件 │ └── logs/ …

[element-ui]el-table在可視區域底部固定一個橫向滾動條

背景當el-table的列太多時&#xff0c;得拖動橫向滾動條才能看到&#xff0c;但如果內容也很多&#xff0c;可能橫向滾動條還看不到&#xff0c;又得滑到最下方才能拖動滾動條&#xff0c;這樣不太方便。若內容過多時&#xff0c;有個固定在可視區域的橫向滾動條就好了&#xf…