OpenCV基礎:視頻的采集、讀取與錄制

從攝像頭采集視頻

相關接口 -?VideoCapture

VideoCapture 用于從視頻文件、攝像頭或其他視頻流設備中讀取視頻幀。它可以捕捉來自多種源的視頻。

主要參數:
cv2.VideoCapture(source):

source: 這是一個整數或字符串,表示視頻的來源。

  • 如果是整數(如0、1等),表示打開對應的攝像頭(0通常是默認攝像頭)。
  • 如果是字符串,表示視頻文件的路徑,或者RTSP流、HTTP流等視頻流地址。

常用方法:
cap.read():

  • 返回兩個值:ret(布爾值,表示是否成功讀取)和 frame(當前幀圖像)。

cap.set(prop_id, value):

  • 設置視頻捕獲設備的屬性。prop_id是屬性標識符,value是設置的值。

常見的 prop_id 參數:

  • cv2.CAP_PROP_FPS:幀率(每秒幀數)。
  • cv2.CAP_PROP_FRAME_WIDTH:視頻寬度。
  • cv2.CAP_PROP_FRAME_HEIGHT:視頻高度。
  • cv2.CAP_PROP_BRIGHTNESS:亮度。
  • cv2.CAP_PROP_CONTRAST:對比度。

代碼:

以下代碼的作用是打開攝像頭,將采集到的視頻流顯示到窗口中。

import cv2#創建窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)#獲取視頻設備
cap = cv2.VideoCapture(0)while True:ret, frame = cap.read()#將視頻幀在窗口中顯示cv2.imshow('video', frame)#等待鍵盤事件key = cv2.waitKey(1)if (key & 0xFF == ord('q')):break#釋放 videocapture
cap.release()
cv2.destroyAllWindows()

?讀取視頻文件

只需要修改 VideoCapture 接口參數即可:

import cv2#創建窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)#讀取視頻文件
cap = cv2.VideoCapture('D:\\resource\\D026網絡購物互聯網科技.mov')while True:ret, frame = cap.read()#將視頻幀在窗口中顯示cv2.imshow('video', frame)#等待鍵盤事件key = cv2.waitKey(40)if (key & 0xFF == ord('q')):break#釋放 videocapture
cap.release()
cv2.destroyAllWindows()

其中 waitKey 設置為40ms,由于當前播放的視頻幀率是25fps,然后1000/25 = 40,于是將waitkey等待間隔設置為了40ms。?

運行后:

視頻錄制

相關接口 - videoWrite

VideoWriter 用于將視頻幀寫入視頻文件。可以設置視頻格式、編解碼器、幀速率等。

主要參數:
cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor)
filename: 輸出視頻文件的路徑或文件名。這個文件將存儲捕捉到的視頻。
fourcc: 編解碼器代碼(FourCC)。這指定了視頻的編碼格式。常見的 fourcc 編碼器包括:

  • cv2.VideoWriter_fourcc(*'XVID'):XVID編碼。
  • cv2.VideoWriter_fourcc(*'MJPG'):MJPEG編碼。
  • cv2.VideoWriter_fourcc(*'MP4V'):MP4編碼。
  • cv2.VideoWriter_fourcc(*'H264'):H.264編碼。

fps: 幀率(每秒幀數)。例如,30 表示每秒30幀。
frameSize: 視頻幀的尺寸,通常是一個元組 (width, height),如 (640, 480)。
isColor: 布爾值,指示是否保存為彩色視頻。True 表示彩色視頻(默認),False 表示灰度視頻。


常用方法:
writer.write(frame): 將視頻幀寫入輸出文件。
writer.release(): 釋放視頻寫入對象,確保文件正確關閉。

代碼:

以下代碼的作用是從攝像頭采集視頻,顯示到窗口中,同時保存到本地。

import cv2#創建VideoWriter
fourcc = cv2.VideoWriter_fourcc(*'XVID')
vw = cv2.VideoWriter('./out.mp4', fourcc, 20, (640, 480))#創建窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)#獲取視頻設備
cap = cv2.VideoCapture(0)while True:ret, frame = cap.read()#將視頻幀在窗口中顯示cv2.imshow('video', frame)#寫數據到多媒體文件vw.write(frame)#等待鍵盤事件key = cv2.waitKey(1)if (key & 0xFF == ord('q')):break#釋放 videocapture
cap.release()#釋放VideoWriter
vw.release()cv2.destroyAllWindows()

查看輸出視頻屬性:

代碼優化:

  • 增加攝像頭開啟判斷
  • 增加采集視頻失敗處理
import cv2#創建VideoWriter
fourcc = cv2.VideoWriter_fourcc(*'XVID')
vw = cv2.VideoWriter('./out.mp4', fourcc, 20, (640, 480))#創建窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)#獲取視頻設備
cap = cv2.VideoCapture(0)while cap.isOpened:ret, frame = cap.read()if ret == False :break;#將視頻幀在窗口中顯示cv2.imshow('video', frame)cv2.resizeWindow('video', 640, 480)#寫數據到多媒體文件vw.write(frame)#等待鍵盤事件key = cv2.waitKey(1)if (key & 0xFF == ord('q')):break#釋放 videocapture
cap.release()#釋放VideoWriter
vw.release()cv2.destroyAllWindows()

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

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

相關文章

解讀Linux Bridge中的東西流向與南北流向

解讀Linux Bridge中的東西流向與南北流向 在現代云計算和虛擬化環境中,網絡流量的管理和優化變得越來越重要。Linux Bridge作為Linux內核提供的一個強大的二層交換機工具,在虛擬化和容器化應用中扮演著至關重要的角色。本文將深入探討Linux Bridge中的兩…

在線實用工具 json格式化,base64轉碼,正則表達式測試工具

1、在線json格式化工具: https://json.openai2025.com/ 2、在線base64轉碼工具 https://base64.openai2025.com/ 3、在線正則表達式測試工具 https://reg.openai2025.com/ 4、在線去水印工具 https://watermark.openai2025.com

java 中 main 方法使用 KafkaConsumer 拉取 kafka 消息如何禁止輸出 debug 日志

pom 依賴&#xff1a; <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>2.5.14.RELEASE</version> </dependency> 或者 <dependency><groupId>org.ap…

車聯網安全--TLS握手過程詳解

目錄 1. TLS協議概述 2. 為什么要握手 2.1 Hello 2.2 協商 2.3 同意 3.總共握了幾次手&#xff1f; 1. TLS協議概述 車內各ECU間基于CAN的安全通訊--SecOC&#xff0c;想必現目前多數通信工程師們都已經搞的差不多了&#xff08;不要再問FvM了&#xff09;&#xff1b;…

RuoYi Cloud項目解讀【四、項目配置與啟動】

四、項目配置與啟動 當上面環境全部準備好之后&#xff0c;接下來就是項目配置。需要將項目相關配置修改成當前相關環境。 1 后端配置 1.1 數據庫 創建數據庫ry-cloud并導入數據腳本ry_2024xxxx.sql&#xff08;必須&#xff09;&#xff0c;quartz.sql&#xff08;可選&…

C#對象池

一、資源管理的困境與破局 在軟件開發的征程中&#xff0c;我們時常陷入資源管理的泥沼。以一個繁忙餐廳為例&#xff0c;每個顧客都急需一個盤子盛美食&#xff0c;可盤子數量有限&#xff0c;如果每次顧客用完盤子后&#xff0c;都不假思索地去清洗一個全新的盤子來供下一位…

Vue.js組件開發-如何使用moment.js

在Vue.js組件開發中&#xff0c;需要處理日期和時間&#xff0c;moment.js 是一個非常有用的庫。moment.js 提供了豐富的API來解析、驗證、操作和顯示日期和時間。 步驟&#xff1a; 1. 安裝moment.js 首先&#xff0c;需要通過npm或yarn安裝moment.js。在項目根目錄下運行以…

微信小程序mp3音頻播放組件,僅需傳入url即可

// index.js // packageChat/components/audio-player/index.js Component({/*** 組件的屬性列表*/properties: {/*** MP3 文件的 URL*/src: {type: String,value: ,observer(newVal, oldVal) {if (newVal ! oldVal && newVal) {// 如果 InnerAudioContext 已存在&…

要避免除數絕對值遠遠小于被除數絕對值的除法

要避免除數絕對值遠遠小于被除數絕對值的除法 用絕對值小的數作除數&#xff0c;舍人誤差會增大&#xff0c;如計算 x y \frac xy yx?,若 0 < ∣ y ∣ < ∣ x ∣ 0<|y|<|x| 0<∣y∣<∣x∣&#xff0c;則可能對計算結果帶來嚴重影響&#xff0c;應盡量避免…

深入了解OpenStack中的隧道網絡

在OpenStack環境中&#xff0c;隧道網絡是一項關鍵技術&#xff0c;它確保了虛擬機之間以及虛擬機與外部網絡之間的安全通信。通過隧道機制&#xff0c;我們可以有效地隔離不同租戶的流量&#xff0c;并支持多租戶環境下的復雜網絡需求。之前我們介紹了隧道網絡&#xff0c;下面…

4. scala高階之隱式轉換與泛型

背景 上一節&#xff0c;我介紹了scala中的面向對象相關概念&#xff0c;還有一個特色功能&#xff1a;模式匹配。本文&#xff0c;我會介紹另外一個特別強大的功能隱式轉換&#xff0c;并在最后介紹scala中泛型的使用 1. 隱式轉換 Scala提供的隱式轉換和隱式參數功能&#…

pandas與sql對應關系【幫助sql使用者快速上手pandas】

本頁旨在提供一些如何使用pandas執行各種SQL操作的示例&#xff0c;來幫助SQL使用者快速上手使用pandas。 目錄 SQL語法一、選擇SELECT1、選擇2、添加計算列 二、連接JOIN ON1、內連接2、左外連接3、右外連接4、全外連接 三、過濾WHERE1、AND2、OR3、IS NULL4、IS NOT NULL5、B…

第432場周賽:跳過交替單元格的之字形遍歷、機器人可以獲得的最大金幣數、圖的最大邊權的最小值、統計 K 次操作以內得到非遞減子數組的數目

Q1、跳過交替單元格的之字形遍歷 1、題目描述 給你一個 m x n 的二維數組 grid&#xff0c;數組由 正整數 組成。 你的任務是以 之字形 遍歷 grid&#xff0c;同時跳過每個 交替 的單元格。 之字形遍歷的定義如下&#xff1a; 從左上角的單元格 (0, 0) 開始。在當前行中向…

《探索鴻蒙Next上開發人工智能游戲應用的技術難點》

在科技飛速發展的當下&#xff0c;鴻蒙Next系統為應用開發帶來了新的機遇與挑戰&#xff0c;開發一款運行在鴻蒙Next上的人工智能游戲應用更是備受關注。以下是在開發過程中可能會遇到的一些技術難點&#xff1a; 鴻蒙Next系統適配性 多設備協同&#xff1a;鴻蒙Next的一大特色…

Harry技術添加存儲(minio、aliyun oss)、短信sms(aliyun、模擬)、郵件發送等功能

Harry技術添加存儲&#xff08;minio、aliyun oss&#xff09;、短信sms&#xff08;aliyun、模擬&#xff09;、郵件發送等功能 基于SpringBoot3Vue3前后端分離的Java快速開發框架 項目簡介&#xff1a;基于 JDK 17、Spring Boot 3、Spring Security 6、JWT、Redis、Mybatis-P…

Vue2: el-table為每一行添加超鏈接,并實現光標移至文字上時改變形狀

為表格中的某一列添加超鏈接 一個表格通常有許多列,網上許多教程都可以實現為某一列添加超鏈接,如下,實現了當光標懸浮在“姓名”上時,改變為手形,點擊可實現跳轉。 <el-table :data="tableData"><el-table-column label="姓名" prop=&quo…

R數據分析:多分類問題預測模型的ROC做法及解釋

有同學做了個多分類的預測模型,結局有三個類別,做的模型包括多分類邏輯回歸、隨機森林和決策樹,多分類邏輯回歸是用ROC曲線并報告AUC作為模型評估的,后面兩種模型報告了混淆矩陣,審稿人就提出要統一模型評估指標。那么肯定是統一成ROC了,剛好借這個機會給大家講講ROC在多…

A3. Springboot3.x集成LLama3.2實戰

本文將介紹集成ollama官網提供的API在Springboot工程中進行整合。由于沒找到java-llama相關合適的sdk可以使用,因此只好對接官方給出的API開發一套RESTFull API服務。下面將從Ollama以下幾個API展開介紹,逐漸的了解其特性以及可以干些什么。具體llama API說明可參數我前面寫的…

面試:類模版中函數聲明在.h,定義在.cpp中,其他cpp引用引入這個頭文件,會有什么錯誤?

1、概述 類模版中函數聲明在.h&#xff0c;定義在.cpp中&#xff0c;其他cpp引用引入這個頭文件&#xff0c;會有什么錯誤?報編譯錯誤&#xff1a;error C2512: Demo<int>: no appropriate default constructor available 舉例如下代碼&#xff1a;demo.h 聲明模版類 …

記一次學習skynet中的C/Lua接口編程解析protobuf過程

1.引言 最近在學習skynet過程中發現在網絡收發數據的過程中數據都是裸奔&#xff0c;就想加入一種數據序列化方式&#xff0c;json、xml簡單好用&#xff0c;但我就是不想用&#xff0c;于是就想到了protobuf&#xff0c;對于protobuf C/C的使用個人感覺有點重&#xff0c;正好…